leetcode 412. Fizz Buzz 竟然没那么简单

今天去力扣刷每日一题,发现很简单的一道题:FizzBuzz;
原题在这

写一个程序,输出从 1 到 n 数字的字符串表示。

  1. 如果 n 是3的倍数,输出“Fizz”;
  2. 如果 n 是5的倍数,输出“Buzz”;
    3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。
    4.如果 n 不满足上述条件,输出n;

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fizz-buzz

  • 在思考后,我的第一想法是:这题好简单,只要循环+判断就可以实现,然后按力扣的尿性,我就开始想有没有复杂度更低的巧妙方法---------------------------------但由于水平有限,最后只是想到,由于3和5本身都是质数,他们同时的倍数就一定是15的倍数,所以判断没必要两个条件同时满足,而是只满足 n是15的倍数,则输出FizzBuzz 即可。
  • 只是判断的条件少了一点 我写下了如下代码,很正常的通过了。
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将这道题写成了一个小故事放在了自己的网站里这个名字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;
    }
}
  • 其实思路是差不多的 用的时间也差不多,不过算是两种写法了,其实我觉得这道题一定会有更巧妙的做法的,只是我还没想到,欢迎各位大佬针对这道简简单单的题提出更多有意思的解法和见解~

你可能感兴趣的:(leetcode,算法,java,leetcode,算法,java)