題目:
請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。
示例 1:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進位制串 00000000000000000000000000001011 中,共有三位為 『1』。
示例 2:
輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進位制串 00000000000000000000000010000000 中,共有一位為 『1』。
示例 3:
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進位制串 11111111111111111111111111111101 中,共有 31 位為 『1』。
用二進位制的位移演算法
public
class
solution
x = x <<1;
//無符號左移
}return counts;
}public
static
void
main
(string[
] args)
}
public
class
solution
return counts;
}public
static
void
main
(string[
] args)
}
時間複雜度:o(log n),逐位判斷需迴圈 log2^n次
空間複雜度:o(1),只用到counts的常數空間
優化:利用n & (n - 1)
因為每次的n - 1都是二進位制的減1(0001)操作,n的最右邊的1變成0,1的右邊都變成1,n & (n - 1) 中 n的右邊都變成0
比如:*n = 9
*bin 1001
*n - 1 = 1000
*n & (n - 1) = 1000
*||*n = 8
*bin = 1000
*n - 1 = 0111
*n & (n - 1) =0000
**所以counts = 2
public
class
solution
return counts;
}public
static
void
main
(string[
] args)
}
時間複雜度:o(n),設n為1的個數,只要位移n次
空間複雜度:o(1),只用到counts的常數空間
劍指offer 15 二進位制中1的個數
位運算 左移運算子m 例如 00001010 2 00101000 10001010 3 01010000 右移運算子與左移類似,但右移時處理最左邊位時稍微複雜 1 如果數字是乙個無符號數值,則用0填補最左邊的n位 2 如果數字是乙個有符號數值,則用數字的符號填補最左邊的n位 00001010 2 ...
劍指Offer 15 二進位制中1的個數
面試題15 二進位制中1的個數 題目 實現乙個函式,輸入乙個整數,輸出該數二級制表示中1的個數。例 把9表示成二進位制是1001,有2位是1。因此如果輸入9,則該函式輸出2。最直接的思路 從低位開始向高位逐一比較是否為1,並計數。時間複雜度 o n num的二進位制位數 空間複雜度 o 1 利用二進...
劍指offer 15 二進位制中1的個數
解題思路一 最佳方法 把乙個整數減去1,再和原整數做 與運算 會把該整數最右邊的1變成0。那麼乙個整數的二進位制中表示中有多少個1,就可以進行多少次這樣的操作。class solution def hammingweight self,n int int res 0 while n res 1 n ...