常規思路:每次將整數右移一位,而後使用位與運算&1,可是該方法只適用於正數。spa
public class Solution { public int NumberOf1(int n) { int ans = 0; //記錄1的個數 while(n != 0){ if((n & 1) == 1) ans++; n = n >> 1; } return ans; } }
若是傳入的參數爲負數則會陷入死循環,好比0x80000000,當把負數右移一位時,高位會補1,最終變爲0xFFFFFFFF,程序爲陷入死循環。code
解決方案:blog
若是傳入參數爲負數,咱們能夠不移動傳入參數,而是移動值爲1的flag變量,該方法每次須要移動32位。時間複雜度O(N)。io
public class Solution { public int NumberOf1(int n) { int ans = 0; int flag = 1; while(flag != 0){ if((n & flag) != 0) ans++; flag = flag << 1; //每次向左移動flag的值,從右往左與n的每一位作位與運算 } return ans; } }
最優解:n二進制中有幾個1,就遍歷幾回的。class
public class Solution { public int NumberOf1(int n) { int ans = 0; //記錄1的個數 while(n != 0){ n = n & (n - 1); //好比1000,1000 & (1000 - 1) = 0,全部就只有一個1 ans++; } return ans; } }