最近在LeetCode上做了一些算法題,大部分是最基礎easy難度的題。做完之後很多算法需要重構纔可以通過所有的cases,在這個過程中我發現有效提高了基礎語言能力,比單純寫項目提高的更快,希望不知道如何提高語言能力的小夥伴可以去上面刷幾道題。
下圖是這一週刷的題,每天上班空隙刷一道,不貪多。
下面介紹其中一道題:
Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
翻譯就是給你一個整形數組,除了某一個元素外,其他元素都會出現兩次,找到那個只出現一次的元素。
首先想到使用遍歷+計數器的方法,大意是使用兩個for循環遍歷比對數組,如果每次循環結果計數器不等於2而是等於1,那麼就返回那個數字
var singleNumber = function(nums) {
let count = 0
for(let i=0;i<=nums.length-1;i++){
for(let m=0;m<=nums.length-1;m++){
if(nums[i]===nums[m]){
count++
}
}
if(count===1){
return nums[i]
}
count = 0;
}
}
這段代碼在桌面編譯器是可以執行得到正確結果的,但是在leetCode上顯示:程序運行超時,這就是leetCode比較有意思的地方了,你的代碼時間複雜度和空間複雜度太高是不可以通過的,這就逼迫我一直重構重構。。。
於是就有了下面這個方案:
var singleNumber = function(nums) {
//查詢數組之中不重複的那個元素,使用排序法,使用一個循環來遍歷數組
//排序後的數學特徵是:如果每次步幅爲2的話,當遇到兩個不相等的數字時,那麼第一個數字就是那個不重複的數
//而且不需要考慮數組角標越界
nums.sort(compare)
let i =0;
while(nums[i]===nums[i+1]){
i=i+2
}
return nums[i]
};
function compare(a,b){
return a-b
}
只是用了1個循環,排序後利用題目的數學特徵去判斷,一對兒一對兒判斷。
例如:
[1,1,2,2,3,4,4]
第一對相等,i=i+2之後判斷 第二對相等 同理判斷第三對不等,那麼答案就是nums[i]
提交後:
提交成功。不過這只是其中一道比較簡單的題,還有大量medium和hard題目前刷起來比較費時,有的則根本沒有思路,但是我相信以後我會全刷完的。
目前leetCode上面有679道題,還在遞增,內容涉及各類算法,數據結構,數據庫,網絡等,確實是一個練手的寶庫。