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