“`java
//注意无符号右移
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
while (n != 0) {
if ((n & 1) == 1) {
count++;
}
n = n>>>1;
}
return count;
}
}
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int sum = 0;
while(n!=0){
n=n&(n-1);
sum++;
}
return sum;
}
}
快速判断1
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int ans = 0;
while(n!=0){
n = n & (n - 1);
ans++;
}
return ans;
}
}
java
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int cnt = 0;
while(n != 0) {
if((n & 1) == 1) { // == 符号优先级高于&符号
cnt ++;
}
n = n >>> 1;
}
return cnt;
}
}
class Solution {
public:
int hammingWeight1(uint32_t n) {
int result = 0;
for (int i = 0; i < 32; i++) {
result += (n & 1);
n >>= 1;
}
return result;
}
int hammingWeight2(uint32_t n) {
int result = 0;
while(n) {
result++;
n &= (n - 1);
}
return result;
}
};
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int sum = 0;
while (n !=0 ) {
n = n & (n - 1);
sum = sum + 1;
}
return sum;
}
}
// 利用 n&(n-1)的特性 空间复杂度O(1) 时间复杂度O(M) M表示有几个1
class Solution {
public:
int hammingWeight(uint32_t n) {
int ret = 0;
while (n) {
n &= n - 1;
ret++;
}
return ret;
}
};
时间复杂度:O(logN) 循环次数等于 n 的二进制位中 1 的个数,最坏情况下 n 的二进制位全部为 1,需要循环 logn 次
空间复杂度:O(1)
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int cnt = 0;
while(n != 0){
n = n & (n - 1);
cnt++;
}
return cnt;
}
}
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
//n与n-1一直相与,直到n为0 与一次 n最右边的1就少一个
int count=0;
while(n!=0){
n=n&(n-1);
count++;
}
return count;
}
}
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int cnt=0;
while(n!=0){
n = n&(n-1);
cnt++;
}
return cnt;
}
}
共以下 31 个回答
“`java
//注意无符号右移
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
while (n != 0) {
if ((n & 1) == 1) {
count++;
}
n = n>>>1;
}
return count;
}
}
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int sum = 0;
while(n!=0){
n=n&(n-1);
sum++;
}
return sum;
}
}
快速判断1
“`java
空间复杂度O(1)、时间为O(n)
public int hammingWeight(int n) {
int tmp=n;
int sum=0;
while(n!=0){
n=n&(n-1);
sum++;
}
return sum;
}
C++实现
“`C++
int hammingWeight(uint32_t n) {
int count = 0;
while (n != 0) {
if (n & 1) {
count++;
}
n >>= 1;
}
return count;
}
“`
n-1:最右边的1变成0,该1右边的0变1
n&n-1:最右边的1变成0
函数的功能是计算给定无符号 32 位整数 n 中的二进制表示中的 1 的个数。它使用了一种称为 “Brian Kernighan 算法” 的方法来高效地实现这个功能。具体来说,它通过不断将 n 与 n-1 进行按位与操作,并将结果赋值给 n ,直到 n 变为 0。在这个过程中,每次按位与操作都会将 n 的二进制表示中最右边的一个 1 变为 0,因此每进行一次按位与操作,都会计数加一。
官解 位运算
时间:O(logn)
空间:O(1)
位运算
时间复杂度为o(n)
【思路】第一次自己写是用循环去写,后改为利用n&(n-1)消掉每一个1,后者效率更高
【复杂度】空间复杂度O(1),时间复杂度O(logn)
n & (n – 1)每次消除最右边的1, 时间复杂度O(logn) 空间复杂度O(1)
时间复杂度O(logn)
空间复杂度O(1)
看了下面的解法好像用 while 循环判断 n 更好一点…
位运算
该代码的时间复杂度为 O(logn),其中n 是二进制位中 “1” 的个数;空间复杂度为 O(1)
很有用的公式
法一:一位一位的判断是否为1
法二:利用公式n&(n-1),每次去掉最右边的一个1。
时间复杂度:O(logN)
空间复杂度:O(1)
c++实现
int hammingWeight(uint32_t n) {
int sum = 0;
while(n!=0)
{
n=n&(n-1);
sum++;
}
return sum;
}
时间复杂度:O(logN) 循环次数等于 n 的二进制位中 1 的个数,最坏情况下 n 的二进制位全部为 1,需要循环 logn 次
空间复杂度:O(1)
O(n)
时间复杂度:O(logn)
n与n-1可以消除最右边的一个1(二进制)
时间复杂度:O(logn)
空间复杂度:O(1)
时间复杂度O(logn)
空间复杂度O(1)
MYbz英雄哪里出来
思路:使用n&(n-1)能够消除n的最后一位1
时间复杂度:O(n) 空间复杂度:O(1)
cpp实现:
class Solution {
public:
int hammingWeight(uint32_t n) {
int sum = 0;
while(n != 0)
{
n &= n – 1;
sum++;
}
return sum;
}
};