题目描述
写一个程序,输出从 1 到 n 数字的字符串表示。
-
如果 n 是3的倍数,输出“Fizz”;
-
如果 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"
]
题目链接: https://leetcode-cn.com/problems/fizz-buzz/
思路1
常规的解法,使用 3 个条件逐个判断,分别是:是否是 3 和 5 的倍数、是否是 3 的倍数、是否是 5 的倍数。注意,“是否是 3 和 5 的倍数” 要当做第一个条件,其他两个条件顺序无所谓。代码如下:
class Solution {
public:
vector<string> fizzBuzz(int n) {
if(n<1) return {};
vector<string> ans;
for(int i=1; i<=n; i++){
if(i%3==0 && i%5==0) ans.push_back("FizzBuzz");
else if(i%3==0) ans.push_back("Fizz");
else if(i%5==0) ans.push_back("Buzz");
else ans.push_back(to_string(i));
}
return ans;
}
};
思路2
思路 1 求解 FizzBuzz 是没问题的,因为条件只有 3 个。假如,现在有一个 FizzBuzzJazz 游戏,也就是 3 的倍数输出 Fizz、5 的倍数输出 Buzz、7 的倍数输出 Jazz、……,总的条件如下:
- 能不能被 3 整除
- 能不能被 5 整除
- 能不能被 7 整除
- 能不能同时被 3 和 5 整除
- 能不能同时被 5 和 7 整除
- 能不能同时被 3 和 7 整除
- 能不能同时被 3,5,7 整除
- 不能被 3,5,7 其中任何一个数整除
可以看到,判断十分繁琐。我们可以换一种思路,先判断能不能被 3 整除,能的话在答案后边加上 Fizz,再判断能不能被 5 整除,能的话在答案后边加上 Buzz,最后判断能不能被 7 整除,能的话在答案后边加上 Jazz,如果都不能的话对应的字符串就是当前数字。代码如下:
class Solution {
public:
vector<string> fizzBuzz(int n) {
if(n<1) return {};
vector<string> ans;
for(int i=1; i<=n; i++){
string cur = "";
if(i%3==0) cur += "Fizz";
if(i%5==0) cur += "Buzz";
if(cur=="") cur = to_string(i);
ans.push_back(cur);
}
return ans;
}
};
思路3
一种更好的写法是将数字和对应的字符串放在哈希表中,这样当我们想要更改这种对应关系时,只需要更改哈希表就行了,不需要对代码的逻辑部分进行修改。代码如下:
class Solution {
public:
vector<string> fizzBuzz(int n) {
if(n<1) return {};
map<int, string> hash({{3,"Fizz"}, {5,"Buzz"}});
vector<string> ans;
for(int i=1; i<=n; i++){
string cur = "";
for(auto it=hash.begin(); it!=hash.end(); it++){
if(i%it->first==0) cur += it->second;
}
if(cur=="") cur = to_string(i);
ans.push_back(cur);
}
return ans;
}
};