题目:
思路:
1 Brian Kernighan算法 x &= (x - 1) 每次可以从最右边擦除一个二进数 1
2 动态规划
(一)代码 Brian Kernighan算法
class Solution { public int[] countBits(int n) { //位运算 算法 x &= (x - 1) 每次可以从最右边擦除一个二进数 1 //Brian Kernighan算法 int[] res = new int[n+1]; for(int i = 1 ; i <= n ; i++){ res[i] = getRes(i); } return res; } public int getRes(int i){ int res = 0; while(i > 0){ i &= (i - 1); res++; } return res; } }
(二)代码 动态规划 - 最低有效位 不太懂这个
class Solution { public int[] countBits(int n) { //动态规划 int[] dp = new int[n+1]; for(int i = 1 ; i <= n ; i++){ dp[i] = dp[i >> 1] + (i & 1); } return dp; } }
。。。。。