Article / 文章

LeetCode 第412题:Fizz Buzz

给你一个整数 n ,返回一个字符串数组 answer(下标从 1 开始),其中: - answer[i] == "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。 - answer[i] == "Fizz" 如果 i 是 3 的倍数。 - answer[i] == "Buzz" 如果 i 是 5 的倍数。 - answer[i] == i (以字符

📖 文章摘要

本文详细解析LeetCode第412题“Fizz Buzz”,这是一道经典的编程面试题。文章提供了多种解法,包含C#、Python、C++三种语言实现,配有详细的分析和性能对比。适合初学者和面试准备者。

核心知识点: 字符串处理、条件判断、代码简化
难度等级: 简单
推荐人群: 编程初学者、面试准备者

题目描述

给你一个整数 n ,返回一个字符串数组 answer(下标从 1 开始),其中:

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

示例

示例 1:

输入:n = 3
输出:["1","2","Fizz"]

示例 2:

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

示例 3:

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

提示

  • 1 <= n <= 10⁴

解题思路

方法一:条件判断法

这是最直观的解法,通过判断每个数字是否能被3和5整除来确定输出。

关键点:

  1. 使用模运算判断整除
  2. 按优先级处理条件(先判断同时整除3和5的情况)
  3. 使用字符串转换处理默认情况

具体步骤:

  1. 创建结果列表
  2. 遍历1到n的每个数字
  3. 判断当前数字是否满足各个条件
  4. 根据条件添加对应字符串到结果列表

方法二:字符串拼接法

这种方法通过字符串拼接来避免多重条件判断,代码更简洁。

关键点:

  1. 使用空字符串作为初始值
  2. 按顺序拼接“Fizz”和“Buzz”
  3. 处理空字符串的情况

图解思路

算法步骤分析表

步骤 操作 状态 说明
初始状态 - [] 空列表
遍历数字 判断条件 [“1”] 不满足任何条件
遇到3的倍数 添加“Fizz” [“1”,“2”,“Fizz”] 满足3的倍数条件
遇到5的倍数 添加“Buzz” [“1”,“2”,“Fizz”,“4”,“Buzz”] 满足5的倍数条件
遇到15的倍数 添加“FizzBuzz” […,“14”,“FizzBuzz”] 同时满足3和5的倍数

状态/情况分析表

情况 输入 输出 说明
基本情况 n=1 [“1”] 最简单情况
3的倍数 n=3 [“1”,“2”,“Fizz”] 包含Fizz
5的倍数 n=5 [“1”,“2”,“Fizz”,“4”,“Buzz”] 包含Buzz
特殊情况 n=15 […,“FizzBuzz”] 包含所有情况

代码实现

C# 实现

public class Solution {
    public IList<string> FizzBuzz(int n) {
        var result = new List<string>();
        
        for (int i = 1; i <= n; i++) {
            if (i % 3 == 0 && i % 5 == 0) {
                result.Add("FizzBuzz");
            } else if (i % 3 == 0) {
                result.Add("Fizz");
            } else if (i % 5 == 0) {
                result.Add("Buzz");
            } else {
                result.Add(i.ToString());
            }
        }
        
        return result;
    }
}

Python 实现

class Solution:
    def fizzBuzz(self, n: int) -> List[str]:
        result = []
        for i in range(1, n + 1):
            if i % 3 == 0 and i % 5 == 0:
                result.append("FizzBuzz")
            elif i % 3 == 0:
                result.append("Fizz")
            elif i % 5 == 0:
                result.append("Buzz")
            else:
                result.append(str(i))
        return result

C++ 实现

class Solution {
public:
    vector<string> fizzBuzz(int n) {
        vector<string> result;
        result.reserve(n);
        
        for (int i = 1; i <= n; i++) {
            if (i % 3 == 0 && i % 5 == 0) {
                result.push_back("FizzBuzz");
            } else if (i % 3 == 0) {
                result.push_back("Fizz");
            } else if (i % 5 == 0) {
                result.push_back("Buzz");
            } else {
                result.push_back(to_string(i));
            }
        }
        
        return result;
    }
};

执行结果

C# 实现

  • 执行用时:168 ms
  • 内存消耗:48.2 MB

Python 实现

  • 执行用时:36 ms
  • 内存消耗:15.1 MB

C++ 实现

  • 执行用时:4 ms
  • 内存消耗:7.3 MB

性能对比

语言 执行用时 内存消耗 特点
C++ 4 ms 7.3 MB 性能最优,内存占用最小
Python 36 ms 15.1 MB 代码简洁,性能适中
C# 168 ms 48.2 MB 易于维护,内存占用较大

代码亮点

  1. 🎯 使用预分配内存优化性能(C++实现中的reserve)
  2. 💡 条件判断的顺序优化,先判断最特殊的情况
  3. 🔍 使用字符串转换而不是字符串拼接,提高性能
  4. 🎨 代码结构清晰,易于理解和维护

常见错误分析

  1. 🚫 忘记处理同时是3和5倍数的情况
  2. 🚫 条件判断顺序错误,导致输出不正确
  3. 🚫 未将数字转换为字符串
  4. 🚫 未考虑性能优化,如预分配内存

解法对比

解法 时间复杂度 空间复杂度 优点 缺点
条件判断法 O(n) O(1) 直观易懂 代码较长
字符串拼接法 O(n) O(1) 代码简洁 可读性稍差

相关题目


📖 系列导航

🔥 算法专题合集 - 查看完整合集

📢 关注合集更新:点击上方合集链接,关注获取最新题解!目前已更新第412题。


💬 互动交流

感谢大家耐心阅读到这里!希望这篇题解能够帮助你更好地理解和掌握这道算法题。

如果这篇文章对你有帮助,请:

  • 👍 点个赞,让更多人看到这篇文章
  • 📁 收藏文章,方便后续查阅复习
  • 🔔 关注作者,获取更多高质量算法题解
  • 💭 评论区留言,分享你的解题思路或提出疑问

你的支持是我持续分享的动力!

💡 一起进步:算法学习路上不孤单,欢迎一起交流学习!