描述:
給定一個非負整數 num。對于 0 ≤ i ≤ num 范圍中的每個數字 i 骂维,計算其二進制數中的 1 的數目并將它們作為數組返回。
示例 1:
輸入: 2
輸出: [0,1,1]
示例 2:
輸入: 5
輸出: [0,1,1,2,1,2]
思路:
首先是一個數減1,對應二進制的變化就是最右的一個1變?yōu)?叨咖,而這個1右邊的所有0變?yōu)?,即相當于包括最后一個1在內的右邊所有位取反荣恐,例如12(1100)減1沟蔑,得到11(1011),然后再與變化前的數12(1100)進行與&運算睁冬,得到8(1000)挎春,可以看出經過這樣一個運算之后這個數的1的個數減少了一個,所以可以利用這個原理豆拨,得到res[i]=res[i&(i-1)]+1
class Solution {
public int[] countBits(int num) {
int[] dp = new int[num+1];
for(int i=1;i<num+1;i++){
dp[i] = dp[i&(i-1)]+1;
}
return dp;
}
}