刷题系列之412. Fizz Buzz

185 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

前言

题目来源

leetcode.cn/problems/fi…

题目介绍

给你一个整数 n ,找出从 1 到 n 各个整数的 Fizz Buzz 表示,并用字符串数组 answer(下标从 1 开始)返回结果,其中:

answer[i] == "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。 answer[i] == "Fizz" 如果 i 是 3 的倍数。 answer[i] == "Buzz" 如果 i 是 5 的倍数。 answer[i] == i (以字符串形式)如果上述条件全不满足。

题目分析

从题目中分析知道,已知给一个整数n,要按照它的条件满足一些输出,然后返回一个长度为n的数组。

并且这个数组的某个位置上的下标,如answer[i],i就是下标从1开始,如果i满足3和5的倍数、3的倍数、5的倍数、都不是。4个条件分别输出对应位置上的结果。因此我们知道应该遍历一个for循环,下标从1开始做判断,然后给对应下标的值赋值。

解题验证

class Solution {
    public List<String> fizzBuzz(int n) {
        List answer=new ArrayList<String>();
        for(int i=1;i<=n;i++){
           if(i%5==0 && i%3==0){
               answer.add("FizzBuzz");
            } else {
                 if(i%5==0){
                     answer.add("Buzz");
                 }
                 else  if(i %3 == 0){
                        answer.add("Fizz");
                 }else{
                     answer.add(i+"");
                 }
             }
        }
        return answer;
       
        
    }
}

如上代码块,定义好一个集合,往里面添加对应的元素,对应不同的条件,得到最终的结果。

image.png

image.png 但是可以看到这种方式还是比较效率的

官方答案与分析

class Solution {
    public List<String> fizzBuzz(int n) {
        List<String> answer = new ArrayList<String>();
        for (int i = 1; i <= n; i++) {
            StringBuffer sb = new StringBuffer();
            if (i % 3 == 0) {
                sb.append("Fizz");
            }
            if (i % 5 == 0) {
                sb.append("Buzz");
            }
            if (sb.length() == 0) {
                sb.append(i);
            }
            answer.add(sb.toString());
        }
        return answer;
    }
}

这是官方的答案,执行结果如下

image.png 本质是一样的,通过for遍历,添加到集合,从内存消耗上来说官方的更省一点内存。改善一下我们之前写的,把最后整数转为字符串这一步改成 String.valueOf(i),取代用+号去做类型转换,效率更高,更省内存。

总结

这道题的难易程度可以看出是相对很简单的,考验我们能正常使用for遍历,下标从1开始、if else的判断逻辑是否缜密。