版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/84697583
时间限制:1秒 空间限制:32768K 热度指数:298520
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
注意
题目说的不太明确,确切的说应该是对一个整数来说,在32位计算机中存储的补码形式中1的个数。也就是说一定要把一个数化为32位的二进制补码。。
思路1:移位和1与运算,对每一位进行判断是0还是1。
public class Solution {
public int NumberOf1(int n) {
int sum = 0;
for(int i = 0; i < 32; i++){
if((n>>i & 1) == 1){
sum++;
}
}
return sum;
}
}
思路2:调用Java的API
public class Solution {
public int NumberOf1(int n) {
return Integer.bitCount(n);
}
}
思路3:调用Java的API
public class Solution {
public int NumberOf1(int n) {
String str = Integer.toBinaryString(n);
int sum = 0;
for(int i = 0; i < str.length(); i++){
if(str.charAt(i) == '1'){
sum++;
}
}
return sum;
}
}
思路4:利用整数二进制补码的求法求解
(笔者觉得思路可以,但通不过。。)
public class Solution {
public static int NumberOf1(int n) {
int[] a = new int[33];
int cnt = 0;
int sum = 0;
int nn = n;
if(n<0){
nn = -n;
}
while(nn>0){
a[cnt] = nn%2;
if(a[cnt]==1){
sum++;
}
cnt++;
nn /= 2;
}
if(n>=0){
return sum;
}else{
sum = 0;
for(int i = 0; i <= 30; i++){
if(i>=cnt){
a[i] = 0;
}
if(a[i] == 1){
a[i] = 0;
}else{
a[i] = 1;
}
}
a[0] += 1;
a[31] = 1;
for(int i = 0; i <= 31; i++){
if(a[i] >= 2){
a[i] -= 2;
a[i+1] += 1;
}
if(a[i] == 1){
sum++;
}
}
return sum;
}
}
}