劍指offer(Java版)day03:二進制中1的個數|數值的整數次方|調整數組順序使奇數位于偶數前面|鏈表中倒數第k個結點|反轉鏈表|合并兩個排序的鏈表

????1二進制中1的個數

【題目】輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼表示。

【考察點】位運算

【思路】把這個數逐次右移,然后和1與,就得到最低位的情況,其他位都為0,如果最低位是0和1與之后依舊 是0,如果是1,與之后還是1。對于32位的整數,這樣移動32次,就記錄了這個數二進制中1的個數了。?

【出錯】與之后的結果是int型數據,我們不能直接把它當boolean型數據來判斷它是否為真,而是判斷它是否==1。

【代碼】

? ? 2數值的整數次方

【題目】給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。

【考察點】代碼的完整性

【思路】兩種情況,exponent>=0或者exponent<0。

1)exponent>=0

exponent=0,return 1

exponent=1,return base

其余做計算

2)exponent<0

exponent=-1,return 1/base

其余做計算

【錯誤】我在做計算的時候直接用base*=base這樣會報錯,后來就int了一個b,b*=base這樣就可以了。

【代碼】

????3調整數組順序使奇數位于偶數前面

【題目】輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位于數組的前半部分,所有的偶數位于數組的后半部分,并保證奇數和奇數,偶數和偶數之間的相對位置不變。

【考察點】代碼的完整性

【思路】使用冒泡排序的思想,只是內層循環中交換的判斷條件變成了:當前位置元素為偶數,當前位置的下一個位置的元素為奇數。

【錯誤】犯了手誤型錯誤,嗚嗚。

比如把“==”寫成了“=”,把內層循環的j全寫成了i,把array全寫了a.....打打~

【代碼】

????4鏈表中倒數第k個結點

【題目】輸入一個鏈表,輸出該鏈表中倒數第k個結點。

【考察點】代碼的魯棒性

【思路】一種比較短小精悍的解法,設置兩個指針,一快一慢,快指針先走k步,然后慢指針和快指針一起走,當快指針到達末尾(==null)的時候,慢指針所指的就是第k個結點。另外設置了一個變量i,這個i的值最后就是該鏈表的長度(包括結尾的空指針)。所以最后return的時候判斷i和k的大小,若i小于k則超出范圍返回null,否則的話返回慢指針所指的結點。

【注意】1)判斷到達末尾的條件是(快指針==null)。2)i小于k說明k值超出了這個鏈表長度的范圍,其中也包括了鏈表為null這種情況(此時i=0)。

【錯誤1】是.next而不是->next,切記。

【錯誤2】誤把最后一個語句中的i<k寫成i>k了。

【代碼】

????5反轉鏈表

【題目】輸入一個鏈表,反轉鏈表后,輸出新鏈表的表頭。

【考察點】代碼的魯棒性

【思路】另外設置了兩個指針,newHead是我們未來要返回的新表頭,next用來暫存舊的鏈表的當前元素的下一位。head一直在向后移動,移動的到的位置就是next所指的位置,newHead緊跟著head移動,但比head慢一步,因為它每次都要等當前元素的next指向變換后才能移動。當head為null時,newHead所指位置就是鏈表的最后一個結點,此時所有結點的next指向都反轉了,newHead也就是新表頭。

【錯誤】手誤把head=next那一句寫成了head=head.next。

【代碼】

? ? 6合并兩個排序的鏈表

【題目】輸入兩個單調遞增的鏈表,輸出兩個鏈表合成后的鏈表,當然我們需要合成后的鏈表滿足單調不減規則。

【考察點】代碼的魯棒性

【思路】順序分別比較兩個鏈表的頭結點,小的那個加入新鏈表。遍歷完其中一個之后,另一個剩余部分加入新鏈表尾部即可。

【錯誤1】出現了中文的“!”

【錯誤2】不小心把ListNode寫成listNode了。

【錯誤3】沒有考慮到list1或者list2為空的情況。

【錯誤4】沒有設置一個臨時結點來作為新鏈表的移動結點。(頭結點確定后它要停在原位,否則新鏈表建好之后它還要再一步一步找回來多麻煩呀,這個時候臨時結點就可以代替它往后移動啦)

【代碼】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容