給定乙個非負整數num
。對於0 ≤ i ≤ num
範圍中的每個數字i
,計算其二進位制數中的1
的數目並將它們作為陣列返回。
示例 1:
輸入: 2
輸出: [0,1,1]
示例 2:
輸入: 5
輸出: [0,1,1,2,1,2]
public int countbits(int num)
private int popcount(int x)
x &= x - 1
將最低有效非零位清零,每次執行此操作,count
加1
,直到所有非零位都被清零為止。
返回的count
的值就是x
的二進位制形式的1
的數目。
2.2.1 最高有效位
public int countbits(int num)
i = 0; // reset i
b <<= 1; // b = 2b
} return ans;
}
\[p(x+b)=p(x)+1, b = 2^m>x
\]\[p(0) = 0
\]\[p(1) = p(0+2^0)=p(0)+1 = 1
\]\[p(2) = p(0+2^1)=p(0)+1 = 1
\]\[p(3) = p(1+2^1)=p(1)+1 = 2
\]\[p(4) = p(0+2^2)=p(0)+1 = 1
\]\[p(5) = p(1+2^2)=p(1)+1 = 2
\]\[p(6) = p(2+2^2)=p(2)+1 = 2
\]\[p(7) = p(3+2^2)=p(3)+1 = 3
\]\[p(8) = p(0+2^3)=p(0)+1 = 1
\]注意到2
、4
和8
剛好是2
的整數次方(即2
的一次方、2
的二次方和2
的三次方等等)。
以4
為例,p(4) = p(0+2^2)
,p(5) = p(1+2^2)
,p(6) = p(2+2^2)
,p(7) = p(3+2^2)
。接下來,由於4
不小於2^2
(b = 2^m > x
),所以b
乘以2
,於是p(8) = p(0+2^3)
。
2.2.2 最低有效位
public int countbits(int num)
\[p(x)=p(x/2)+(x\quad mod\quad2)
\]\[p(0) = 0
\]\[p(1) = p(0)+(1\quad mod \quad2) = 0 + 1 = 1
\]\[p(2) = p(1)+(2\quad mod \quad2) = 1 + 0 = 1
\]\[p(3) = p(1)+(3\quad mod \quad2) = 1 + 1 = 2
\]\[p(4) = p(2)+(4\quad mod \quad2) = 1 + 0 = 1
\]\[p(5) = p(2)+(5\quad mod \quad2) = 1 + 1 = 2
\]\[p(6) = p(3)+(6\quad mod \quad2) = 2 + 0 = 2
\]\[p(7) = p(3)+(7\quad mod \quad2) = 2 + 1 = 3
\]\[p(8) = p(4)+(8\quad mod \quad2) = 1 + 0 = 1
\]將01
向左移動一位(實際上相當於乘以2
),得到10
(即2
),說明1
和2
的1
的數目都為1
。
將10
加1
得到11
(即3
),所以p(3)=p(1)+1
。
注意到移位操作不會改變1
的數目,但是1
的數目會隨著加1
操作而增加乙個。
因此,2
的整數次方的1
的數目都為1
。
2.2.3 最後設定位
public int countbits(int num)
由於x&(x-1)
會將x
的最低有效非零位清零,這樣會少了乙個1
,所以有p(x)=p(x&(x-1))+1
。
p(0) = 0
p(1) = p(1&(1-1))+1 = p(0) + 1 = 0 + 1 = 1
p(2) = p(2&(2-1))+1 = p(0) + 1 = 0 + 1 = 1
p(3) = p(3&(3-1))+1 = p(2) + 1 = 1 + 1 = 2
p(4) = p(4&(4-1))+1 = p(0) + 1 = 0 + 1 = 1
p(5) = p(5&(5-1))+1 = p(4) + 1 = 1 + 1 = 2
p(6) = p(6&(6-1))+1 = p(4) + 1 = 1 + 1 = 2
p(7) = p(7&(7-1))+1 = p(6) + 1 = 2 + 1 = 3
p(8) = p(8&(8-1))+1 = p(0) + 1 = 0 + 1 = 1
參考: 位操作型動態規劃 位元位計數
給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2 輸出 0,1,1 從題目中的二進位制數能夠比較明顯的看出該題目屬於位操作型動態規劃,同時屬於計數型的動態規劃 這個的最後一步應該很好理解,就是它的最後一位二...
位元位計數
一 題目描述 二 題目分析 題解參考 自己分析沒分析出來,看完題解,忍不住妙出了聲。對於數字有兩類,偶數與奇數,從二進位制的角度看,奇數的二進位制標示肯定比前面乙個偶數多1,因為偶數的最低為0,而因為最低為為0,則讓乙個偶數的二進位制1的個數一定和自身除以2後的二進位制1的個數相等。通過上面這兩個特...
位元位計數
位元位計數 給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。題解 這種題如果不加限制的話可以選擇移位 1的方式計算1的個數 但是要求是在o n 的時間複雜度下完成就需要腦筋急轉彎啦 0000 0 0001 1 0000 00...