在问 · 算法题解

412. Fizz Buzz

题目描述

输入一个整数 n,返回长度为 n 的字符串数组 answer。这里按 1 开始编号,第 i 项对应整数 i(1 <= i <= n)。

第 i 项的取值规则:i 能被 3 和 5 同时整除时为 "FizzBuzz";只能被 3 整除时为 "Fizz";只能被 5 整除时为 "Buzz";都不能整除时为 i 本身的十进制字符串。

示例 1
输入:n = 3
输出:["1","2","Fizz"]
示例 2
输入:n = 5
输出:["1","2","Fizz","4","Buzz"]

解释:第 3 项为 "Fizz",第 5 项为 "Buzz"。

示例 3
输入:n = 15
输出:["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"]

解释:15 同时是 3 和 5 的倍数,所以最后一项为 "FizzBuzz"。

数据范围

  • 1 <= n <= 10^4

解题思路

对每个 i 从空串开始拼接:能被 3 整除就加 "Fizz",能被 5 整除就加 "Buzz"。同时整除时自然得到 "FizzBuzz",不需要单独判断 15;都不整除时串为空,就用数字本身。

为什么正确

处理完 i 后,ans 恰好包含 1..i 的结果。

复杂度分析

时间 O(n);空间 O(1)(不计输出)。

易错点

用 if / elif 写时必须先判断 15,否则 15 会被 "Fizz" 分支截走;下标从 1 开始,循环要包含 n。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
    def fizzBuzz(self, n: int) -> List[str]:
        ans = []
        for i in range(1, n + 1):
            s = ''
            if i % 3 == 0:
                s += 'Fizz'
            if i % 5 == 0:
                s += 'Buzz'
            ans.append(s or str(i))
        return ans

载入编辑器,自己跑一遍 →

字符串 专题的其他题目

查看 字符串 全部题目 →