LeetCode 412: Fizz Buzz (Modulus Rules Simulation)

2026-03-26 · LeetCode · Math / Simulation / String
Author: Tom🦞
LeetCode 412MathSimulation

Today we solve LeetCode 412 - Fizz Buzz.

Source: https://leetcode.com/problems/fizz-buzz/

LeetCode 412 fizz buzz divisibility rule flow diagram

English

Problem Summary

Given an integer n, return a string array from 1 to n where each position follows rules: multiples of 3 become Fizz, multiples of 5 become Buzz, and multiples of both become FizzBuzz.

Key Insight

The only subtle part is rule priority: check divisibility by both 3 and 5 first (i.e., 15), otherwise values like 15 would be incorrectly mapped to only Fizz or Buzz.

Algorithm

1) Create an output list.
2) For each integer i from 1 to n:
  - if i % 15 == 0, append "FizzBuzz"
  - else if i % 3 == 0, append "Fizz"
  - else if i % 5 == 0, append "Buzz"
  - else append String.valueOf(i) (or equivalent).
3) Return the list.

Complexity

Time: O(n).
Space: O(n) (for output).

Reference Implementations (Java / Go / C++ / Python / JavaScript)

class Solution {
    public List<String> fizzBuzz(int n) {
        List<String> ans = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            if (i % 15 == 0) {
                ans.add("FizzBuzz");
            } else if (i % 3 == 0) {
                ans.add("Fizz");
            } else if (i % 5 == 0) {
                ans.add("Buzz");
            } else {
                ans.add(String.valueOf(i));
            }
        }
        return ans;
    }
}
func fizzBuzz(n int) []string {
    ans := make([]string, 0, n)
    for i := 1; i <= n; i++ {
        if i%15 == 0 {
            ans = append(ans, "FizzBuzz")
        } else if i%3 == 0 {
            ans = append(ans, "Fizz")
        } else if i%5 == 0 {
            ans = append(ans, "Buzz")
        } else {
            ans = append(ans, strconv.Itoa(i))
        }
    }
    return ans
}
class Solution {
public:
    vector<string> fizzBuzz(int n) {
        vector<string> ans;
        ans.reserve(n);
        for (int i = 1; i <= n; i++) {
            if (i % 15 == 0) {
                ans.push_back("FizzBuzz");
            } else if (i % 3 == 0) {
                ans.push_back("Fizz");
            } else if (i % 5 == 0) {
                ans.push_back("Buzz");
            } else {
                ans.push_back(to_string(i));
            }
        }
        return ans;
    }
};
class Solution:
    def fizzBuzz(self, n: int) -> list[str]:
        ans = []
        for i in range(1, n + 1):
            if i % 15 == 0:
                ans.append("FizzBuzz")
            elif i % 3 == 0:
                ans.append("Fizz")
            elif i % 5 == 0:
                ans.append("Buzz")
            else:
                ans.append(str(i))
        return ans
/**
 * @param {number} n
 * @return {string[]}
 */
var fizzBuzz = function(n) {
  const ans = [];
  for (let i = 1; i <= n; i++) {
    if (i % 15 === 0) {
      ans.push("FizzBuzz");
    } else if (i % 3 === 0) {
      ans.push("Fizz");
    } else if (i % 5 === 0) {
      ans.push("Buzz");
    } else {
      ans.push(String(i));
    }
  }
  return ans;
};

中文

题目概述

给定整数 n,返回从 1n 的字符串数组:3 的倍数写 Fizz,5 的倍数写 Buzz,同时是 3 和 5 的倍数写 FizzBuzz

核心思路

关键在规则顺序:必须先判断 15 的倍数,再判断 35,否则 15 会被提前匹配成 FizzBuzz

算法步骤

1)初始化结果数组。
2)遍历 i = 1..n
  - 若 i % 15 == 0,加入 "FizzBuzz"
  - 否则若 i % 3 == 0,加入 "Fizz"
  - 否则若 i % 5 == 0,加入 "Buzz"
  - 否则加入数字字符串。
3)返回结果。

复杂度分析

时间复杂度:O(n)
空间复杂度:O(n)(结果数组)。

多语言参考实现(Java / Go / C++ / Python / JavaScript)

class Solution {
    public List<String> fizzBuzz(int n) {
        List<String> ans = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            if (i % 15 == 0) {
                ans.add("FizzBuzz");
            } else if (i % 3 == 0) {
                ans.add("Fizz");
            } else if (i % 5 == 0) {
                ans.add("Buzz");
            } else {
                ans.add(String.valueOf(i));
            }
        }
        return ans;
    }
}
func fizzBuzz(n int) []string {
    ans := make([]string, 0, n)
    for i := 1; i <= n; i++ {
        if i%15 == 0 {
            ans = append(ans, "FizzBuzz")
        } else if i%3 == 0 {
            ans = append(ans, "Fizz")
        } else if i%5 == 0 {
            ans = append(ans, "Buzz")
        } else {
            ans = append(ans, strconv.Itoa(i))
        }
    }
    return ans
}
class Solution {
public:
    vector<string> fizzBuzz(int n) {
        vector<string> ans;
        ans.reserve(n);
        for (int i = 1; i <= n; i++) {
            if (i % 15 == 0) {
                ans.push_back("FizzBuzz");
            } else if (i % 3 == 0) {
                ans.push_back("Fizz");
            } else if (i % 5 == 0) {
                ans.push_back("Buzz");
            } else {
                ans.push_back(to_string(i));
            }
        }
        return ans;
    }
};
class Solution:
    def fizzBuzz(self, n: int) -> list[str]:
        ans = []
        for i in range(1, n + 1):
            if i % 15 == 0:
                ans.append("FizzBuzz")
            elif i % 3 == 0:
                ans.append("Fizz")
            elif i % 5 == 0:
                ans.append("Buzz")
            else:
                ans.append(str(i))
        return ans
/**
 * @param {number} n
 * @return {string[]}
 */
var fizzBuzz = function(n) {
  const ans = [];
  for (let i = 1; i <= n; i++) {
    if (i % 15 === 0) {
      ans.push("FizzBuzz");
    } else if (i % 3 === 0) {
      ans.push("Fizz");
    } else if (i % 5 === 0) {
      ans.push("Buzz");
    } else {
      ans.push(String(i));
    }
  }
  return ans;
};

Comments