---
# System prepended metadata

title: 0428 JS  Unit5

---

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