今天去力扣刷每日一题,发现很简单的一道题:FizzBuzz;
原题在这
写一个程序,输出从 1 到 n 数字的字符串表示。
- 如果 n 是3的倍数,输出“Fizz”;
- 如果 n 是5的倍数,输出“Buzz”;
3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。
4.如果 n 不满足上述条件,输出n;
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fizz-buzz
class Solution {
public List<String> fizzBuzz(int n) {
List<String> list = new ArrayList<String>();
for(Integer i = 1;i<=n;i++){
if(i%15==0){
list.add("FizzBuzz");
continue;
}
if(i%5==0){
list.add("Buzz");
continue;
}
if(i%3==0){
list.add("Fizz");
continue;
}
list.add(i.toString());
}
return list;
}
}
正常到这里,我的每日一题就结束了,该去做一些其他的事情了,但是我突然有些不理解,这道题难道就这么简单吗?为什么这道题要用FizzBuzz这个奇怪的名字呢? 有没有什么会不会巧妙的让人眼前一亮的解法?
joelgrus的面试故事
这道题并不像看起来那么简单,在我查询时,又发现很多博主提到这道看起来很容易的题,stackoverflow创始人曾经在他的一本书里写道,不要假设程序员都会写程序,招一个程序员来先写个FizzBuzz看看,结果可能会令你吃惊。另外我发现真的很多计算机专业的同学,真的连这道题都不会,这代表可能他们可能没有接触过代码。
而再一次看原题时,我找到了一个规律,当我们查看整个list时,会发现其中确实有规律可循
['1', '2', 'fizz', '4', 'buzz', 'fizz', '7', '8', 'fizz', 'buzz', '11', 'fizz', '13', '14', 'fizzbuzz',
'16', '17', 'fizz', '19', 'buzz', 'fizz', '22', '23', 'fizz', 'buzz', '26', 'fizz', '28', '29', 'fizzbuzz',
'31', '32', 'fizz', '34', 'buzz', 'fizz', '37', '38', 'fizz', 'buzz', '41', 'fizz', '43', '44', 'fizzbuzz',
'46', '47', 'fizz', '49', 'buzz', 'fizz', '52', '53', 'fizz', 'buzz', '56', 'fizz', '58', '59', 'fizzbuzz']
看这一串奇奇怪怪的数字我们不难发现,由于3和5两数的特性,输出规律是15个一循环的。所以我们可以换一种思路,先判断n整除15的结果和余数,然后添加一遍list就好,于是我写下以下代码:对照表法!
class Solution {
public List<String> fizzBuzz(int n) {
List<String> list = new ArrayList<String>();
String[] chart = {"FizzBuzz","","","Fizz","","Buzz","Fizz","","","Fizz","Buzz","","Fizz","",""};
for(Integer i = 1;i <= n;i++){
if(chart[i % 15].equals(""))
list.add(i.toString());
else
list.add(chart[i % 15]);
}
return list;
}
}