入坑codewars

前幾天作LeetCode上的大數乘法,代碼沒錯,可就是提交不成功,顯示SyntaxError: Unexpected token var
我把全部代碼都註釋掉,只留下return 1,依然報一樣的錯誤。。。感受LeetCode對JSer不是特別友好
剛剛在node社區看到有人推薦codewars,立馬去體驗一番。註冊要寫個代碼測試一下身份,這個細節有意思(雖然代碼很簡單)。
codewars,黑色的主題風格,很符合coder。並且可用語言很是廣,連TypeScript都有!!
而後codewars給我推薦了一題=>codewars-iqTestjavascript

這題雖然很簡單,可是頗有意思,對個人啓發挺大的,讓我發現了本身的一些不足。
題目:意思就是要找出數串(不是數組,這是一個坑)中跟其餘數不相同的一個數(奇偶方面)java

clipboard.png

我一開始的寫法是:以第一個數的奇偶性爲標準,後面的數跟這個標準同樣,那就返回以前記錄的一個跟這個標準不一樣的數的下標(若是有的話)。若是跟這個標準不一樣,那就記錄下標。這樣遍歷完以後就若是尚未return,那結果就只能是第一個數或者最後一個數。判斷一下seen就知道是頭仍是尾了。時間複雜度O(n)node

function iqTest(numbers){
  let number = numbers.split(' ')
  let tag = number[0]%2
  let resIndex = ''
  let seen = false
  for(let i = 1, len = number.length; i < len; i++) {
    if(number[i]%2 === tag) {
      if(resIndex !== '') return resIndex+1
      seen = true
    }else {
      resIndex = i
    }
  }
  return seen? resIndex + 1: 1
}

雖然成功AC,但我明顯感受代碼寫得不是很優雅。在評論區看到有人用兩個數組分別裝奇數偶數,我恍然大悟,瞬間感受本身宛如zz...我怎麼一開始沒想到orz
這一題徹底暴露了個人不足,讓我深思。遇到編程題,也許我更多地是在微觀上進行思考,關注執行流程的每一個細節,代碼怎麼執行。這個是沒錯的,但缺少了宏觀的視角,會變得片面。正所謂不識廬山真面目,只緣身在此山中,這一題若是宏觀上把奇偶剝離,那什麼問題都解決了,簡直不要太簡單!!編程

function iqTest(numbers){
  let number = numbers.split(' ')
  let odd = [],even = []
  number.forEach((item,index) => {
    item % 2 == 0? even.push(index + 1): odd.push(index + 1)
  })
  return odd.length === 1? odd[0]: even[0]
}

短短几行代碼,也是一次遍歷,時間複雜度O(n),這纔是優雅地寫代碼!(看到社區高票答案有用filter掃兩次,我以爲用forEach一次就夠了)
此外,AC以後還能看大佬們的代碼,按clever排序,看到了一下代碼:數組

clipboard.png
看到這樣的代碼,我真的有點興奮,想法太妙了!雖然包含indexOf,一共遍歷了三遍。可是不重要,關鍵是這個思想要學習,能夠應用到其餘地方。
首先他用map將每一個元素模2,這就像同化同樣,由於只有奇數和偶數,因此先把奇數和偶數都分別同化成一個樣,0或1。求和,大於1就返回偶數的位置,不然返回奇數的位置。
不過我以爲reduce累加的步驟沒有必要,只要把前三個數加起來就知道不一樣的數的奇偶性,或者能夠在第一次遍歷就記錄0或1的數量,省一次遍歷。學習

喜歡codewars,這裏人個個都是人才,說話又好聽測試

相關文章
相關標籤/搜索