iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
自我挑戰組

【用 JS 學演算法】前端工程師學徒系列 第 4

【Day 04】LeetCode:Fizz Buzz ( 用 JavaScript 學演算法 )

我們透過 LeetCode #412 Fizz Buzz 來實際感受解決問題的過程 ( 題目連結 )

一、理解題目

  • 輸入:一個正整數
  • 從 1 到 n,依序判斷是否可以被 3、5、3和5 整除,並有相對應的字串來代表
  • 輸出:一個 string array,紀錄每個判斷的結果

二、Edge Case

是否有極限值或特殊情況:

  • 是否會有負數或 0

三、題目思考

使用哪種資料結構:Array、String

  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

邏輯:

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

程式碼實作:

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
  
};

暴力法的改善:

  // 改僅使用陣列變數
  // 透過加號自動轉型
  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 的條件,方法一將會變得很複雜。因此我們調整邏輯判斷的流程,並使用字串相加的方式來處理。

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

五、學到什麼

  • 自動轉型:數字加字串
  • 思考程式在不同情境下,是否具有擴充的彈性

原文連結:LeetCode:Fizz Buzz ( 用 JavaScript 學演算法 ) - Ted's Point 泰德觀點


上一篇
【Day 03】如何評估演算法的效率? Big O 與時間複雜度
下一篇
【Day 05】LeetCode:Plus One ( 用 JavaScript 學演算法 )
系列文
【用 JS 學演算法】前端工程師學徒9

尚未有邦友留言

立即登入留言