题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
leecode338. Bit位计数
思路:
这个题目只需要输入的这个数,所以思路是不一样的。
用O(sizeof(输入))即O(n)方法其实最简单
解法1:
因为有补码,所以不能用n/=2的方法跳出循环,必须循环32次
class Solution {
public:
int NumberOf1(int n) {
int Res = 0;
int flag = 1;
int n1 = 32;
while (n1--){
if (flag&n)
Res++;
flag=flag << 1;
}
return Res;
}
};
public class Solution {
public int NumberOf1(int n) {
int res = 0;
int num = 32;
int flag = 1;
while(num-->0){
if((flag & n) != 0){
res++;
}
flag = flag << 1;
}
return res;
}
}
解法2:
库函数还是厉害。。。
class Solution {
public:
int NumberOf1(int n) {
return(__builtin_popcount (n));
}
};
这种方法会报错:占用空间过多
#include <iostream>
using namespace std;
int NumberOf1(int n) {
//int res[n+1]={0};
int *res=(int *)malloc(sizeof(int)*(n+1));
res[0]=0;
res[1]=1;
for(int i=0;i<=n;i++)
{
if(i%2==0)
res[i]=res[i/2];
else
res[i]=res[i/2]+1;
}
int Res1=res[n];
free(res);
return Res1;
}
int main()
{
cout<<NumberOf1(15)<<endl;
return 0;
}