劍指offer第二版 面試題15(java)

2021-09-13 04:14:06 字數 1452 閱讀 2019

面試題15:二進位制中1的個數

題目描述:

請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1,因此如果輸入9,該函式輸出2

基礎:

1. 位運算:左移補右,右移補左;若為負數,則右移後左邊補1

2. & 與運算

eg:(無符號) 6:110  3:10  6&3=10→2   6&4=100→4

方法:

一、可能引起死迴圈的方法

判斷最右邊第一位是否為1(&1=1),計數後將原數右移,直到計數完成。

問題:

①是否可以直接改為除以2:不可以,因為除法的效率更低

②輸入負數的情況:如傳入-1,則表達為11,右移後會因為是負數而在左邊補1,重新變為11,則會陷入迴圈

二、常規解法

不右移輸入數字,改為左移變數flag=1,每次與每一位進行比對

flag=1時,比對第一位,左移得10,比對第二位……

三、優化解法

在【二】的解法中,n的二進位制有多少位就需要比對多少次,優化後的解法只需要迴圈1的個數的次數

1. 先把二進位制數分為兩種,一種是末尾為1,一種是末尾為0

2. 末尾為1的二進位制數,減1後,最後一位變為了0,相當於只對最後一位取反,所以n&(n-1)只有最後一位不同,變為0

3. 末尾為0的二進位制數,減1後,最右邊的1變為0,該1右邊的數全變為0,如1100,減1後,變為1011,第二位的1變為0,後兩位的0變為1,n&(n-1)得到的為1000,即把原數的最右的1變為了0

4. 總結:把二進位制數減1後得到的n-1,和原數n進行與(&)操作後,得到的是原數n在二進位制表達中,最右位置的1變為0的數

所以:使用迴圈,每次對n減1,並count++,直到n=0

其他類似問題:

判斷乙個數字是不是2的整數次方——2的整數次方中只有乙個1

輸入兩個數字m,n,需要改變m的多少位,才能得到n——先異或,後判斷結果中1的數目

※ n&(n-1)消除最右的1

**:

// 方法二

public class q15

flag = flag<<1;

} system.out.printf("count:%d",count);

}}

// 方法三

public class q15_3

system.out.printf("count:%d",count);

}}

劍指offer第二版 面試題6(java)

面試題6 從尾到頭列印鍊錶 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值 鍊錶的結點定義如下 public class listnode 注意 面試中,如果打算修改輸入的資料,最好先問好是否資料是允許修改的 思路 1.遍歷順序從頭到尾,列印順序從尾到頭,第乙個結點最開始被訪問,但是最...

劍指offer第二版 面試題8 java

題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標 分析 情況 一 有右子樹,這時只需要把其右孩子作為下乙個遍歷的 並不是要找的 節點,然後沿著該節點的左子樹 如果有的話 出發,直到遇到葉子節點,那麼該葉子節...

劍指offer第二版 面試題9(java)

面試題9 用兩個棧實現佇列 題目描述 方法 兩個棧 stack1 stack2 插入時,直接放入stack1 刪除時,直接彈出pop2中的物件 如果pop2為空,則先將pop1中的物件放入stack2中,再從stack2裡pop第乙個 如 依次放入stack1中1 2 3,在彈出並放入stack2中...