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