题目描述:
写一个程序,输出从 1 到 n 数字的字符串表示。
1. 如果 n 是3的倍数,输出“Fizz”;
2. 如果 n 是5的倍数,输出“Buzz”;
3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。
示例:
n = 15,
返回:
[
"1",
"2",
"Fizz",
"4",
"Buzz",
"Fizz",
"7",
"8",
"Fizz",
"Buzz",
"11",
"Fizz",
"13",
"14",
"FizzBuzz"
]
解法:
1.模拟法
思路
就像你每次玩 FizzBuzz 那样,你只需要判断这个数是能被 3 整除? 还是能被 5 整除? 或者是都能被整除。
算法
初始化一个空的答案列表。
遍历 1 ... N1...N。
对于每个数,判断它能不能同时被 3 和 5 整除,如果可以就把 FizzBuzz 加入答案列表。
如果不行,判断它能不能被 3 整除,如果可以,把 Fizz 加入答案列表。
如果还是不行,判断它能不能被 5 整除,如果可以,把 Buzz 加入答案列表。
如果以上都不行,把这个数加入答案列表。
2.字符串连接
算法
我们放弃使用之前的联合判断,取而代之依次判断是否能被给定的数整数。这道题中,就是依次判断能不能被 3 整除,能不能被 5 整除。如果能被 3 整除,就把对应的 Fizz 连接到答案字符串,如果能被 5 整除,就把 Buzz 连接到答案字符串。
举个例子,现在需要判断 15,步骤将会是下面这样的:
条件 1: 15 % 3 == 0, num_ans_str = "Fizz"
条件 2: 15 % 5 == 0, num_ans_str += "Buzz"
=> num_ans_str = "FizzBuzz"
3.散列表法
算法
把所有的映射关系放在散列表 fizzBuzzHash 中,这个散列表形如 { 3: 'Fizz', 5: 'Buzz' }。
遍历 1 ... N1...N。
对于每个数字,遍历 fizzBuzzHash 中的键,检查是否能被它整除。
如果这个数能被键整除,就把当前键映射的值加到到答案字符串后面去。对于散列表的每个键值对,都这样操作。
最后将答案字符串加入答案列表。