---
# System prepended metadata

title: '#412 Fizz Buzz'
tags: [LeetCode, 待優化, String]

---

# #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)
  }
```


## 五、學到什麼
* 自動轉型：數字加字串
* 思考程式在不同情境下，是否具有擴充的彈性