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 = 1; i < str.length - 1; i++) { // str[1] 開始才是數字
sum += str[i] * (9 - i) // 使用乘法的話字串會自動轉成數字
}
sum+= Number(str[9]) // 使用加法需要先將字串轉成數字
console.log(sum)
if (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]
}
Edge case 處理:
if (str === 'Y100000001') return true // 蔣中正的身分證
if (str.length !== 10) return false
if (!(str[0] >= 'A' && str[0] <= 'Z')) return false // 加上 ! 後要再一個括弧包起來
如何檢驗 str[1] - str[9] 是不是數字?
實戰:數字位數加總
自己試寫:
function add(n) {
let m = n
let sum = 0
console.log(sum)
while(m != 0) {
let digits = m % 10
sum += digits
m = Math.floor(m / 10)
}
return sum
}
console.log(add(12345))
老師解答方法一:數字解
function addDigits(n) {
if (n < 0) {
n = n * -1
}
let sum = 0
while(n != 0) {
sum += n % 10
n = Math.floor( / 10)
}
return sum
}
差異:老師的比較簡單。
老師解答方法二:字串偷吃步
function addDigits(n) {
n = n + ' '
let sum = 0
for(let i = 0; i < n.length; i++) {
sum += Number(n[i])
}
return sum
}
經典題目解解看
盡可能不使用內建函式,動腦去思考怎麼利用迴圈、函式、判斷式!
只要會程式三寶就可以寫。
實戰:判斷等差數列
檢查要從第三個元素開始。
自己試寫:
老師方法一:
方法二:先算出公差
差異:存取範圍不一樣,計算方式不一樣,但應該都可以啦。
Edge case 處理:
雖然沒有這行也能執行,但在其他語法有可能會出現,養成好習慣。
實戰:身分證驗證
自己試寫:
我寫完這個,A123456789 剛好答案正確,結果在簡化 str[i] * j 的過程中,才發現原來轉化成數值是有固定值啦⋯⋯頓時心很累,那我是在解什麼東西⋯⋯
有機會再重寫吧⋯⋯
老師解法:
Edge case 處理:
如何檢驗 str[1] - str[9] 是不是數字?
實戰:數字位數加總
自己試寫:
老師解答方法一:數字解
差異:老師的比較簡單。
老師解答方法二:字串偷吃步