劍指 Offer 15 二進位制中1的個數

2021-10-07 21:34:45 字數 1496 閱讀 6483

題目:

請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 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 ...