Lichen5221 / Report-Daily

記錄每日上課內容與作業。
0 stars 0 forks source link

2021-05-02 #13

Open Lichen5221 opened 3 years ago

Lichen5221 commented 3 years ago

經典題目解解看

盡可能不使用內建函式,動腦去思考怎麼利用迴圈、函式、判斷式!

只要會程式三寶就可以寫。

實戰:判斷等差數列

檢查要從第三個元素開始。

自己試寫:

function ap(arr) {
  for (var i = 2; i < arr.length ; i++) {
    if (arr[i] - arr[i - 1] !== arr[i - 1] - arr [i - 2]) {
      return false
    }
  }
  return true
}

console.log(ap([0, 2, 4, 6, 8, 11]))

老師方法一:

for (let i = 1; i < arr.length - 1; i++) {
  if (arr[i] - arr[i - 1] !== arr[i + 1} - arr[i]) {
    return false
  }
}
return true

方法二:先算出公差

for (let i = 1; i < arr.length; i++) {
  let d = arr[1] - arr[0]
  if (arr[i] - arr[i - 1] !== d) {
    return false
  }
}
return true

差異:存取範圍不一樣,計算方式不一樣,但應該都可以啦。

Edge case 處理:

雖然沒有這行也能執行,但在其他語法有可能會出現,養成好習慣。

1. 空陣列:if (arr.length === 0) return true
2. 只有一個元素的陣列(符合等差數列):if (arr.length <= 1) return true 

實戰:身分證驗證

身分證驗證規則:

  1. 字母轉換成數字(有其自訂數值)
  2. 數字依序加權 1 9 8 7 6 5 4 3 2 1 1 。

自己試寫:

function check(str) {
  var asc = String(str.charCodeAt(0))
  let total = asc[0] * 1 + asc[1] * 9 + str[1] * 8 + ... + str[9] * 1
  console.log(total)
  if (total % 10 === 0) {
    console.log('true')
  } else {
    console.log('false')
  }
}
check('A123456789')

我寫完這個,A123456789 剛好答案正確,結果在簡化 str[i] * j 的過程中,才發現原來轉化成數值是有固定值啦⋯⋯頓時心很累,那我是在解什麼東西⋯⋯

有機會再重寫吧⋯⋯

老師解法:

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
}