当前位置: 首页 > news >正文

LeetCode 412 - Fizz Buzz

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 1. 定义结果数组
      • 2. 从 1 循环到 n
      • 3. 判断逻辑顺序
      • 4. 默认输出数字
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

这道题其实是很多人入门算法时的经典“Hello World”级别的逻辑题——Fizz Buzz。它看起来很简单,但却经常被面试官用来考察你对逻辑判断、代码结构清晰度以及边界条件处理的习惯。

在这篇文章里,我们会从实际开发的思维出发,聊聊怎么用 Swift 实现一个干净、清晰、可扩展的 Fizz Buzz,同时结合一些真实的使用场景,比如日志输出、系统监控状态显示等,帮你理解这类“规则映射”的问题其实在工程里非常常见。

描述

题目要求我们给定一个整数 n,然后从 1 到 n 输出一个字符串数组。规则如下:

  • 如果当前数字能被 3 整除,就输出 "Fizz"
  • 如果能被 5 整除,就输出 "Buzz"
  • 如果能同时被 3 和 5 整除,就输出 "FizzBuzz"
  • 如果都不是,就输出数字本身(转成字符串)

举个例子:

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

其实这题的本质就是一个多条件分支判断问题,但因为是一个有序循环 + 多重条件输出的逻辑模式,它和很多“规则驱动型输出”的开发任务是一样的,比如:

  • 根据数值范围动态输出日志级别(INFO / WARN / ERROR)
  • 根据配置状态动态拼接输出字符串
  • 定时任务里判断条件输出不同命令

题解答案

这道题的核心逻辑是 循环判断 + 字符串拼接
一个清晰的实现方式如下:

class Solution {func fizzBuzz(_ n: Int) -> [String] {var result: [String] = []for i in 1...n {if i % 3 == 0 && i % 5 == 0 {result.append("FizzBuzz")} else if i % 3 == 0 {result.append("Fizz")} else if i % 5 == 0 {result.append("Buzz")} else {result.append(String(i))}}return result}
}

这段代码的思路非常直观,和你自然思考的顺序一致:
先判断最特殊的情况(3 和 5 同时整除),再分别判断 3、5 的倍数,最后处理默认情况。

题解代码分析

我们拆开看下上面的实现:

1. 定义结果数组

var result: [String] = []

这是用来存储每个位置的结果字符串。
Swift 的数组是动态增长的,所以直接 append 即可。

2. 从 1 循环到 n

for i in 1...n {...
}

1...n 是闭区间,代表从 1 一直到 n。
每一次循环我们就处理一个数字。

3. 判断逻辑顺序

if i % 3 == 0 && i % 5 == 0 {result.append("FizzBuzz")
} else if i % 3 == 0 {result.append("Fizz")
} else if i % 5 == 0 {result.append("Buzz")
} else {result.append(String(i))
}

这里的判断顺序非常关键。
我们必须先判断 3 和 5 同时整除的情况,否则 15 会在前面的 i % 3 == 0 被提前拦截,输出 "Fizz" 而不是 "FizzBuzz"

一个常见的面试坑就在这里:如果写成

if i % 3 == 0 {result.append("Fizz")
} else if i % 5 == 0 {result.append("Buzz")
} else if i % 3 == 0 && i % 5 == 0 {result.append("FizzBuzz")
}

"FizzBuzz" 的情况永远不会被触发。
这体现了条件判断中优先级设计的重要性

4. 默认输出数字

当不满足以上任意条件时,就直接把 i 转为字符串输出。

示例测试及结果

我们来实际跑一下 Demo:

let solution = Solution()print(solution.fizzBuzz(3))
// 输出: ["1", "2", "Fizz"]print(solution.fizzBuzz(5))
// 输出: ["1", "2", "Fizz", "4", "Buzz"]print(solution.fizzBuzz(15))
// 输出: ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"]

可以看到结果完全符合预期。

如果你把这个逻辑嵌到 App 或日志系统中,比如:

for word in solution.fizzBuzz(15) {print("[Log] -> \(word)")
}

控制台会打印出一串规律性的字符串,非常直观。
这类逻辑其实在数据监控、调试日志中经常出现。

时间复杂度

整个算法的循环是从 1 到 n,每次判断常数时间内完成。
因此时间复杂度为:

O(n)

即随输入规模线性增长。

空间复杂度

我们需要存储一个长度为 n 的字符串数组,每个元素占用常数级空间。
所以空间复杂度为:

O(n)

总结

Fizz Buzz 虽然是一道非常简单的题,但它考察的其实是:

  • 逻辑顺序控制能力:判断顺序不对就会出错;
  • 代码清晰性:条件简洁、无冗余;
  • 边界意识:是否考虑到 n = 1 这种最小输入;
  • 可扩展性:以后如果加更多规则,比如 7 的倍数输出 “Pop”,代码还能方便扩展吗?

如果你在写业务代码时经常会有类似“条件映射”逻辑(比如状态码、配置项、日志等级判断),
其实都能用类似的思路写出更干净、可读性更高的实现。

这就是 Fizz Buzz 这道题的真正价值:
不是考你“能不能写出来”,而是“写得是否清晰优雅”。

http://www.dtcms.com/a/553655.html

相关文章:

  • 大型门户网站建设特点怎么知道一个网站是谁做的
  • IDC报告:阿里云市场份额升至26.8%,连续5季度上涨
  • 佛山房地产网站建设51建模网官方网站
  • 字格格子模板合集:多样练字格硬笔书法训练模板(可打印)
  • Arduino ESP32-C3 串口使用注意事项
  • MCP是什么及如何开发一个MCPServer
  • 程序逆向分析
  • 卷绕设备与叠片设备
  • 个人可以做购物网站吗西安曲江文化园区建设开发有限公司网站
  • 网站当前链接深圳坪地网站建设 自助建站 五合一建站平台
  • GD32F407VE天空星开发板的ADC按键(ADKey)的实现
  • 使用 Nginx 轻松处理跨域请求(CORS)
  • 2025 年世界职业院校技能大赛机电设备安装与运维赛道备赛
  • 网站备案帐号用织梦做模板网站
  • 我的第一份工作:996
  • 贵州网推传媒有限公司企业网站seo优
  • 矿泉水除溴化物的解决方案
  • Bugku-Web题目-cookies
  • C# 类的方法介绍
  • 打破数据孤岛:制造行业档案管理方案如何实现数据互通与协同?
  • 加强 廉政网站建设衍艺网站建设
  • 中企高呈建设网站律师在哪个网站做推广好
  • 昆山非标设计工厂6名SolidWorks设计师共享一台服务器
  • 未来之窗昭和仙君(四十八)开发商品进销存修仙版——东方仙盟筑基期
  • 佛山设计网站浙江省国有建设用地出让网站
  • 跨厂商(华为 H3C)防火墙 GRE 隧道部署
  • 抖音网站单产品网站
  • 品牌网站源码江阴响应式网站建设
  • Java中wait和await的区别
  • DBeaver连接本地MySQL、创建数据库表的基础操作