题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
分析思路
首先需要判断给出的程序段中参数n是指什么,首先如果n是输入的整形,那么首先第一步就是把整形转换成二进制,然后判断二进制的每一位是否为1.但是我使用此方法只获得了44%的通过率,提示测试用例中负数是无法使用此方法的。代码如下:
public class Solution {
public int NumberOf1(int n) {
int sum=0;
if(n==1){
sum=1;
return sum;
}
while(n>=2){
if(n%2==1){
sum++;
}
n=n/2;
}
if(n==1)
sum++;
return sum;
}
}
那么表示不能当成输入的整形或者我使用的方式不对。既然我们把n指的是二进制,那么就把二进制转换成字符串,一个一个字符取出来判断是不是1,是1累加,不是就不做处理。之后我将我想到的思路运用到程序中,但是提示我只跑了22%的用例。结果是程序中的n是用二进制表示的,下列代码中直接将n作为整形表示了。代码如下:
public class Solution {
public int NumberOf1(int n) {
int sum=0;
String s = Integer.toString(n);
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='1')
sum++;
}
return sum;
}
}
而正确的表现形式应该是如下所示:
public class Solution {
public int NumberOf1(int n) {
int sum=0;
char[]s = Integer.toBinaryString(n).toCharArray();
for(int i=0;i<s.length;i++){
if(s[i] == '1')
sum++;
}
return sum;
}
}