劍指offer上的11 15題,希望自己能堅持下去

2021-10-01 13:16:33 字數 2027 閱讀 5338

上面幾套題其實思路都是一樣的,掌握了規律後其實很容易得到想要的結果,所以今天我就多寫寫,爭取盡快寫完這上面的試題。

題目描述:輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。

題目分析:這道題本身並不算難,但是必須搞清楚負數補碼的關係後才好繼續,這方面也是我的弱點,所以我打算在這裡複習一下負數補碼的關係:

正數:正數的補碼是其二進位制表示,與原碼相同。如+9的補碼是00001001,和自身的二進位制表示相同。

負數:求負整數的補碼,將其原碼除符號位外的所有位取反後加1。如-5的補碼是這樣求的。正數5的碼(00000101)———所有位取反(11111010)————加一後操作(11111010)

同乙個數字在不同的補碼表示形式中是不同的。比如-15的補碼,在8位二進位制中是11110001,然而在16位二進位制補碼表示中,就是1111111111110001。以下都使用8位2進製來表示。在牛客網上應該預設是32位,4個位元組,因此求補碼的時候需要注意與的數的大小。

已知乙個數的補碼,求原碼的操作其實就是對該補碼再求補碼。

因此該題目的具體做法如下,先判斷正負,再移位操作,而對某個位取反,在計算機中其實就是異或操作:

class

solution

intcount(0

);if(n <0)

while

(n !=0)

return count;}}

;

題目描述:給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。保證base和exponent不同時為0。這個題表面上看起來比較簡單。但是如果將負數考慮進來的話就需要額外操心了。如果base為負的話,那麼當exponet為偶數時,需要去掉負號。而如果exponent為負數的話,那麼相當於求原來數的倒數了。

class

solution

if(base <0)

double output=1;

for(

int i =

0; i < exponent; i++)if

(exponentflag ==1)

if(baseflag ==1)

}return output;}}

;

題目描述:輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

題目分析:這個題第一眼看上去並不難,最簡單的思路就是設計兩個陣列,乙個存奇數,乙個存偶數,然後最終將奇數先放回原來的坑中,再將偶數放回之前的坑中。這樣的做法時間複雜度使2n,空間複雜度是n。

class

solution

}for

(int i =

0; i < hellokitty.

size()

; i++)}

}};

但是如果不適用額外的空間的話,有沒有什麼比較好的解法呢?考慮到不能改變先後順序,可以採用氣泡排序的思想,如果前偶後奇,則交換兩者的位置,這樣的話兩次巢狀迴圈後就能達到理想的效果。

//這裡懶得寫了,直接拷貝別人的即可,時間複雜度略高,n^2

class

solution}}

}};

題目描述:輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。

題目分析:這道題的解法很多,比如說將整個鍊錶壓入棧中,然後依次彈出k個即可,這樣的話時間複雜度為n+k,空間複雜度為n略大。故考慮用兩個指標的方法,這種方法非常巧妙。指標a從頭部出發,而另乙個指標b從第k個節點出發,當指標b到達末尾時,指標a所指向的位置就是所求節點。

/*

struct listnode

};*/

class

solution

while

(p2-

>next !=

nullptr

)return p1;}}

;

劍指offer真題11 15

11題 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示 法一 讓n減去1,我們發現,在讓他和原來的n按位與之後,n中的1會減少乙個,依次迴圈下去,就可以累計出1的個數,且這個方式不用擔心負數的問題 class solution return count 法二 定義乙個flag為1,...

劍指offer題六

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。public static void main string args ...

劍指offer 程式設計題

輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的 ...