[ALG101] Unit5:經典題目解解看 ( live coding )


Posted by cici0825 on 2020-07-07

5.2 實戰:判斷等差數列


理解題目:
等差數列,數字之間的公差相等。以 1,3,5,7,9 的範例而言,9-7=2 , 7-5=2 , 5-3=2 , 3-1=2,反之。規律為數字之間相差數目相等。

建構思路:
確認每個數字的 公差數 是否相等。

解法示範

  • 先算出 arr[1] - arr[0] 當作公差數
  • 判斷 arr[i] - arr[i-1] 是否等於公差
    function isValid(arr) {

        // 把公差數存進變數
        let d = arr[1]-arr[0]
        for(let i=1 ; i< arr.length;i++){

        //如果  前位 - 後位 不等於 第一個判斷的  公差數 回傳false
            if( arr[i]-arr[i-1] !== d){
               return false
             }
        }
        return true
    }

    console.log(isValid([1,2,3,4,5]))

Edgecase

  • 空陣列 []
  • 只有一個元素的陣列 [3]
   function isValid(arr) {
   //良好習慣,依舊寫上判斷 Edgecase 的程式碼
        if( arr.length < 1 ) return true
        let d = arr[1]-arr[0]
   //因為判斷條件 為 1~arr.length-1 當空陣列或是只有一個元素的時候 就不會進入迴圈,而直接return ture
        for(let i=1 ; i< arr.length;i++){

            if( arr[i]-arr[i-1] !== d){
               return false
             }
        }
        return true
    }

    console.log(isValid([]))   > true
    console.log(isValid([3]))  > true

5.3 實戰:身分證驗證


理解題目:
身分證驗證規則 字首字母(英文轉指定數字) + 後 9 碼,共有 11 個數字。 再把每一個數字依序乘上 1、9、8、7、6、5、4、3、2、1、1,將乘完的結果加總並能夠整除 10 為有效 ID 。

建構思路:

  • 字首是否為英文字母
  • 儲存英文字母的數字
  • 數字相乘規律 1 + 9-1 + 1
  • 總和需被10整除

解法示範:

  • 先把英文代表的數字用物件的方式存進一個 function 中。
  • return 寫好的物件[傳進來的參數]
  • 把英文代表數拆解為兩個數字並存進各自的變數中
  • 在初始總和先把英文字母相乘後加總的作為第一個總和
  • 把有規律的相乘相加使用迴圈處理
  • 剩下的額外在for外解決 改變總和,並把總和轉乘數字。
  • return 最終總和對10取於數
    function isValidTwId(str) {

        // 抓取 str [0] 的數字存進 n 裡

        let n = alphaToNumber(str[0])

      // 取出英文的第一個數字:讓代表數 除十並無條件捨去,變成 n 的第一個數字。 32 ==> 3
        let n1 = Math.floor(n/10)

       // 取英文的第二個數字:讓 n 對 10 取餘數
        // ex 32 % 10 = 3.2 > 餘數為 2
        let n2 = n % 10 

        // 把英文代表數的總和先算起來,做為初始和
        let sum = n1*1 + n2*9

        // 從第一位開始跑 到 str.length-1 因為最後一個不符合規律,所以在for外處理。
        for(let i=1 ; i< str.length-1;i++){

            //當 i =1 * (9-1=8) 這裡是乘法 js會自動如果是字串會轉為數字
            sum += str[i]*(9-i)

        }

        // 把 sum 轉成數字
        sum += Number(str[9])

        // 得到sum的總和後對 10 取餘數是否為零?是的話 return true
        return sum % 10 === 0
    }


  function alphaToNumber(s) {

       //存放英文對應數字的function
      let mapping = {
          A:10, B:11, C:12, D:13, E:14, 
          F:15, G:16, H:17, I:34, J:18, 
          K:19, L:20, M:21, N:22, O:35,
          P:23, Q:24, R:25, S:26, T:27,
          U:28, V:29, W:32, X:30, Y:31, Z:33 
      }
       return mapping[s]
    }

5.4 實戰:數字位數加總


  • 解法(一)

    • var
      
  • 解法(二)

    • var
      

#javascript #ID #week03 #ALG101







Related Posts

如何用 ROS Topic 控制機器人移動

如何用 ROS Topic 控制機器人移動

Go Web 程式設計入門教學:基礎介紹與環境建置

Go Web 程式設計入門教學:基礎介紹與環境建置

每日心得筆記 2020-06-15(一)

每日心得筆記 2020-06-15(一)


Comments