对应leetcode_338
思路:
n&(n-1):消除最低位的1.
leetcode_338:
dp[i]: 数字 i二进制中含有1的个数
如果i的最低位为1, 那么dp[i] = dp[i-1] + 1;
如果i的最低为为0, 那么dp[i] = dp[ i >> 1] ; //i的最低为为0,二进制数量和 i 右移1位是一样的
如何判断某个数的最低位是1还是0? -------> n & 1 == 1---最低位为1, n&1 == 0最低位为0
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*/
int NumberOf1(int n) {
// write code here
//dp[i]:二进制数i中含有1的个数dp[i],
//如果i的最后一位为1,那么dp[i] = dp[i - 1] + 1
//如果i的最后一位为0,那么dp[i] = dp[i >> 1]
// vector<long> dp(n + 1, 0);
// for(int i = 1; i <= n; ++i){
// dp[i] = i & 1? dp[i-1] + 1 : dp[i>>1];
// }
// return dp[n];
int i = 0;
for(; n; ++i){
n = n&(n-1);
}
return i;
}
};