# 0428 JS Unit5 **1.判斷等差數列** (公差一樣) 要做到的判斷是這些都相等 ``` arr[1] - arr[0] arr[2] - arr[1] arr[3] - arr[2] arr[4] - arr[3] ``` 第一個解法 ``` function isValid(arr){ for(let i=1; i<arr.length - 1; i++){ if(arr[i] - arr[i-1] !== arr[i+1]- arr[i]){ return false } } return true } isValid([1,3,5,7,9]) ``` 第二個解法(比較容易懂),先把公差求出 公差是 `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++){ if(arr[i] - arr[i-1] !==d){ return false } } return true } console.log(isValid([1,3,5,7,9])) ``` 雖然已經做好了,我們還要想到一些 edge case 例如:如果是空陣列呢?如果只有一個元素的陣列時呢? 所以加入這些考量條件 ``` function isValid(arr){ if(arr.length <=1) return true let d = arr[1] - arr[0] for(let i=1; i<arr.length; i++){ if(arr[i] - arr[i-1] !==d){ return false } } return true } ``` _ **2.身分證驗證** (驗證規則在維基百科) ``` function isValidTWId(str){ let n = alphaToNumber(str[0]) let n1 = Math.floor(n / 10) let n2 = n % 10 let sum n1*1 + n2*9 for(let i=0; i<str.length - 1; i++){ sum += str[i] * ( 9 - i) } sum += Number(str[9]) return sum % 10 === 0 } } function alphaToNumber(s){ 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] } console.log(isValidTWId('M140051653')) ``` edge case : 處理不合法的輸入 `if(str.length !== 10) return false` `if(!(str[0] >= 'A' && str[0] <='Z')) return false` `一個還有檢查後面是不是數字 之後要補` 再把這三個加到函式的前面先判斷 _ **3.數字位數加總** (類似水仙花數) 輸入1234 輸出 1+2+3+4=10 第一種解法,用數學解 嘗試找規則 3412 / 10 = 341...2 341 / 10 =34...1 34 /10 = 3...4 3 / 10 = 0ß ``` function addDigits(n){ if (n < 0){ n = n * -1 } let sum = 0 while(n != 0){ sum += n % 10 n = Math.floor(n / 10) } return sum } console.log(addDigits(3412)) ``` 第二種解法:用字串偷吃步,把n變成字串 ``` function addDigits(n){ n = n + '' let sum = 0 for( let i=0; i<length; i++){ sum += Number(n[i]) } return sum } ```