天天看點

JZ11 二進制中1的個數

JZ11 二進制中1的個數

 這道題的前置知識:

  1. 十進制如何轉成二進制
  2. 無符号數與有符号數
  3. 左移右移對原數的影響

問題1:商重複除2取模,模數最後倒置

JZ11 二進制中1的個數

問題3:一般都是左右移位補0,但是負數不一樣,右移補1 因為第一位是符号位

具體思路:将10進制數與1進行&運算,如果10進制數最右邊的二進制為1結果為1,為0結果為0

然後繼續進行一個右移操作,前邊補0【這種情況未考慮負數】【不右移用除法也可以但是與運算更快】

既然右移不行那就,1進行左移,後邊補0,再做與運算,左移之後的1就能判斷原數相應的2進制位是0還是1

JZ11 二進制中1的個數

代碼實作:

public class Solution {
    public int NumberOf1(int n) {
            int num=0;
            int value=1;
        while(value!=0)
        {
            if((value&n)!=0)
                num++;
            value <<= 1;
            System.out.print(value&n);
        }
        return num;
    }
}
           

時間O(32)  空間O(1)

更加巧妙的方法,原數-1  然後兩數作與運算結果為x,直到x為0

JZ11 二進制中1的個數

 時間 O(X)  x為二進制中一的個數   

public class Solution {
    public int NumberOf1(int n) {
        int num=0;
    while(n!=0)
    {
        n=n&(n-1);
        num++;
    }
        return num;
}
}
           

總結自己看:導緻自己在這道題花費較多的時間就是

if((value&n)!=0)   與運算之後不是==1

題意要逐字看,是哪個數在左移

短短幾行代碼看了一個多小時

繼續閱讀