前幾天作LeetCode上的大數乘法,代碼沒錯,可就是提交不成功,顯示SyntaxError: Unexpected token var
我把全部代碼都註釋掉,只留下return 1
,依然報一樣的錯誤。。。感受LeetCode對JSer不是特別友好
剛剛在node社區看到有人推薦codewars,立馬去體驗一番。註冊要寫個代碼測試一下身份,這個細節有意思(雖然代碼很簡單)。
codewars,黑色的主題風格,很符合coder。並且可用語言很是廣,連TypeScript都有!!
而後codewars給我推薦了一題=>codewars-iqTestjavascript
這題雖然很簡單,可是頗有意思,對個人啓發挺大的,讓我發現了本身的一些不足。
題目:意思就是要找出數串(不是數組,這是一個坑)中跟其餘數不相同的一個數(奇偶方面)java
我一開始的寫法是:以第一個數的奇偶性爲標準,後面的數跟這個標準同樣,那就返回以前記錄的一個跟這個標準不一樣的數的下標(若是有的話)。若是跟這個標準不一樣,那就記錄下標。這樣遍歷完以後就若是尚未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排序,看到了一下代碼:數組
看到這樣的代碼,我真的有點興奮,想法太妙了!雖然包含indexOf,一共遍歷了三遍。可是不重要,關鍵是這個思想要學習,能夠應用到其餘地方。
首先他用map將每一個元素模2,這就像同化同樣,由於只有奇數和偶數,因此先把奇數和偶數都分別同化成一個樣,0或1。求和,大於1就返回偶數的位置,不然返回奇數的位置。
不過我以爲reduce累加的步驟沒有必要,只要把前三個數加起來就知道不一樣的數的奇偶性,或者能夠在第一次遍歷就記錄0或1的數量,省一次遍歷。學習
喜歡codewars,這裏人個個都是人才,說話又好聽測試