FizzBuzz
カウントゲームのFizzBuzzでは、プレイヤーは1から数え上げ、いくつかの数字を単語に置き換えます。ターン番号 n が与えられたら、そのターンでプレイヤーが言う内容を返してください。n が3と5の両方で割り切れる場合は "FizzBuzz"、3だけで割り切れる場合は "Fizz"、5だけで割り切れる場合は "Buzz"、それ以外の場合は "7" のように、n 自体を文字列として返します。
関数
- ninteger
- ターン番号(正の整数)
- 戻り値string
- ターン n で言われる単語または数値を文字列として
制約
1 ≤ n ≤ 109- 答えは、その数そのものの場合でも、常に文字列です。
例
- 入力
- n = 15
- 出力
- "FizzBuzz"
- 説明
- 15 を 3 で割ると 5、15 を 5 で割ると 3 で、どちらも余りがないので、15 ターンは
"FizzBuzz"です。
- 入力
- n = 7
- 出力
- "7"
- 説明
- 7を3で割ると余りは1、5で割ると余りは2なので、当てはまる単語はなく、数値をテキストとして返します。
"7"
発展問題
新しいルールでは、7の倍数を"Bazz"にします。単語は順番に連結されるので、105は"FizzBuzzBazz"になります。組み合わせごとにケースを作らずに、どう追加すればよいでしょうか?
ヒント
1つずつ開いてください。開くたびに少しずつ答えに近づきます。
剰余演算子を使うと、ある数が別の数で割り切れるかどうかがわかります。
nは、nを 3 で割った余りが 0 のとき、ちょうど 3 で割り切れます。15について考えてみましょう。15は3でも5でも割り切れます。15が
"FizzBuzz"になり、"Fizz"にならないようにするには、どのチェックを先に実行すべきでしょうか?まず15で割り切れるかをテストし、次に3で、次に5でテストします。どれにも一致しない場合は、数値を文字列に変換します。変換ですべての桁が出力されることを確認してください。そうすれば、10^9は科学表記ではなく
"1000000000"になります。
解説
各ルールは、余りを確認する条件です。注意すべきなのは順序です。15は3で割り切れるため、3を先に判定してすぐに返す関数は、15に対して"Fizz"を返します。組み合わせたケースを先に判定するか、両方の判定結果から答えを組み立てましょう。
両方のチェックから単語を組み立てる
考え方
空の単語から始めます。nが3で割り切れる場合は"Fizz"を追加し、nが5で割り切れる場合は"Buzz"を追加します。両方のチェックが常に実行されるため、15の倍数は両方の部分を順番に取得し、特別なケースなしで"FizzBuzz"になります。単語がまだ空の場合は、どちらのルールも適用されていないので、数値を文字列として返します。
アルゴリズム
wordを空の文字列に設定します。n % 3 == 0の場合、"Fizz"を追加します。n % 5 == 0の場合、"Buzz"を追加します。wordが空の場合、文字列に変換したnを返します。- それ以外の場合は
wordを返します。
def fizzBuzz(n):
word = ""
if n % 3 == 0:
word += "Fizz"
if n % 5 == 0:
word += "Buzz"
# An empty word means neither 3 nor 5 divides n.
if word == "":
return str(n)
return word15を確認し、次に3、次に5を確認
考え方
3と5の両方で割り切れる数は、ちょうど15で割り切れる数です。3と5に共通の因数がないためです。したがって、組み合わせたルールはn % 15 == 0という1つのチェックで、最初に行います。これに当てはまらなかった場合、3で一致すれば3のみ、5で一致すれば5のみです。各チェックはすぐにreturnし、どれにも一致しなければ、その数を文字列として返します。
アルゴリズム
n % 15 == 0の場合は、"FizzBuzz"を返します。n % 3 == 0の場合は、"Fizz"を返します。n % 5 == 0の場合は、"Buzz"を返します。- それ以外の場合は、
nを文字列に変換し、すべての桁を書き出して返します。
def fizzBuzz(n):
if n % 15 == 0:
return "FizzBuzz"
if n % 3 == 0:
return "Fizz"
if n % 5 == 0:
return "Buzz"
return str(n)
落とし穴と境界ケース
- 15より先に3または5をテストしてすぐに返すと、15、30、45は
"Fizz"になります。 - 文字列ではなく数値を返している。7のターンは
"7"です。 - 大きな数を指数表記に変換している。Rでは通常の変換で10^9は
1e+09と出力されます。format(n, scientific = FALSE)を使います。 - 答えを返すのではなく、出力している。
よくある質問3
コーディング面接でFizzBuzzが出題されるのはなぜですか?
短いルールのセットを、余りのテスト、正しい順序での条件判定、適切な戻り値の型を使って、動作するコードにできるかを確認します。普段からコーディングしている人なら数分で解けるため、難しい問題に進む前の簡単な確認として役立ちます。
剰余演算子を使わずにFizzBuzzを解けますか?
はい。整数除算で割り、商に元の数を掛けて n と比較します。余りがない場合に限り、両者は等しくなります。数列全体を出力するときは、3 と 5 でリセットされるカウンターを2つ保持することもできます。
FizzBuzz の時間計算量はどのくらいですか?
1つの数値に答える場合は O(1) です。剰余のチェックを一定回数行い、最大10桁の数値を変換します。1から n までの列を出力する場合は O(n) です。
似た問題
同じ考え方を使う問題です。2〜3問解くとパターンが身につきます。
def fizzBuzz(n):
# ここにコードを書いてくださいテスト #1
テスト #2
引数
n = 15
期待される出力
"FizzBuzz"