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

????1二進制中1的個數(shù)

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

【考察點】位運算

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

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

【代碼】

? ? 2數(shù)值的整數(shù)次方

【題目】給定一個double類型的浮點數(shù)base和int類型的整數(shù)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調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面

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

【考察點】代碼的完整性

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

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

比如把“==”寫成了“=”,把內(nèi)層循環(huán)的j全寫成了i,把array全寫了a.....打打~

【代碼】

????4鏈表中倒數(shù)第k個結(jié)點

【題目】輸入一個鏈表,輸出該鏈表中倒數(shù)第k個結(jié)點。

【考察點】代碼的魯棒性

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

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

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

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

【代碼】

????5反轉(zhuǎn)鏈表

【題目】輸入一個鏈表,反轉(zhuǎn)鏈表后,輸出新鏈表的表頭。

【考察點】代碼的魯棒性

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

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

【代碼】

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

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

【考察點】代碼的魯棒性

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

【錯誤1】出現(xiàn)了中文的“!”

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

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

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

【代碼】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容