解題說明
Fizz Buzz
題目描述:給定整數 n,對 1 到 n 的每個整數,若為 15 的倍數輸出 "FizzBuzz",若為 3 的倍數輸出 "Fizz",若為 5 的倍數輸出 "Buzz",否則輸出該數字的字串形式。
解題思路:直觀模擬即可。注意判斷順序:先檢查 15 的倍數(同時是 3 和 5 的倍數),再分別檢查 3 和 5 的倍數,最後是一般數字。也可以用字串拼接策略:先建立空字串,若能被 3 整除則附加 "Fizz",若能被 5 整除則附加 "Buzz",若結果仍為空則放入數字字串,此法在擴展條件時更有彈性。
C++ 解法
複雜度分析
時間複雜度:O(n) — 對每個 1 到 n 的整數執行常數次操作。
空間複雜度:O(n) — 輸出陣列包含 n 個字串。
虛擬碼
1. Initialize empty result array 2. For i from 1 to n: a. If i % 15 == 0: append "FizzBuzz" b. Else if i % 3 == 0: append "Fizz" c. Else if i % 5 == 0: append "Buzz" d. Else: append to_string(i) 3. Return result
其他解法
字串拼接法(可擴展):對每個 i 建立空字串 s,若 i % 3 == 0 則 s += "Fizz",若 i % 5 == 0 則 s += "Buzz",若 s 仍為空則 s = to_string(i)。當條件增多時(如加入 7 對應 "Jazz")只需增加判斷而不必修改其他分支。
雜湊映射法:用 map<int, string> 儲存 {3: "Fizz", 5: "Buzz"},對每個 i 遍歷映射表依序拼接,最具擴展性。
延伸思考
- 如果新增規則:7 的倍數輸出 "Jazz",如何優雅地擴展程式碼?
- 如何用函數式程式設計(如 transform + lambda)重寫此解法?
- FizzBuzz 是否能在不使用模運算(%)的情況下實作?