# #412 Fizz Buzz ###### tags: `LeetCode` `String` `待優化` :::info :pushpin: Want to learn more? ➜ [HackMD Tutorials](https://hackmd.io/c/tutorials) ::: --- [#412 Fizz Buzz 題目連結](https://leetcode.com/problems/fizz-buzz/) ## 一、理解題目 * 輸入:一個正整數 * 從 1 到 n,依序判斷是否可以被 3、5、3和5 整除,並有相對應的字串來代表 * 輸出:一個 string array,紀錄每個判斷的結果 ## 二、Edge Case ### 是否有極限值或特殊情況 * 是否會有負數或 0 ## 三、題目思考 ### 使用哪種資料結構: 1. 令 i = 1 2. 如果 `i % 15 = 0`,字串 "FizzBuzz" 3. 如果 `i % 3 = 0`,字串 "Fizz" 4. 如果 `i % 5 = 0`,字串 "Buzz" 5. 如果都不是,字串 "i" 6. i = i+1 7. 回到步驟 2 **邏輯:** ```1 let arr be an empty array let str be an empty string for i (1 to n) do if (i%15 = 0) then str = "FizzBuzz" else if (i%3 = 0) then str = "Fizz" else if (i%5 = 0) then str = "Buzz" else str = "i" (i to string) end if add str to arr end for return arr ``` **程式碼實作:** ```javascript=1 var fizzBuzz = function(n) { let arr = [] let str = "" for (let i=1 ; i<=n ; i++) { if (i%15 === 0) { str = "FizzBuzz" } else if (i%5 === 0) { str = "Buzz" } else if (i%3 === 0) { str = "Fizz" } else { str = i.toString() } arr.push(str) } return arr }; ``` **暴力法的改善:** ```javascript=1 // 改僅使用陣列變數 // 透過加號自動轉型 let arr = [] for (let i=1 ; i<=n ; i++) { if (i%3 === 0 && i%5 === 0) { arr.push("FizzBuzz") } else if (i%5 === 0) { arr.push("Buzz") } else if (i%3 === 0) { arr.push("Fizz") } else { arr.push(i+'') } } return arr ``` ## 四、優化改善 ### 優化一:字串串接 ( String Concatenation ) 如果多出 Divisible by 7 的條件,方法一將會變得很複雜。因此我們調整邏輯判斷的流程,並使用字串相加的方式來處理。 ```javascript=1 let arr = [] for (let i=1 ; i<=n ; i++) { let str = '' if (i%3 === 0) { str += 'Fizz' } if (i%5 === 0) { str += 'Buzz' } // 如果是空字串 if (!str) { str = i + '' } arr.push(str) } ``` ## 五、學到什麼 * 自動轉型:數字加字串 * 思考程式在不同情境下,是否具有擴充的彈性