开始之前看一下java中int是怎样存储的 java中int的范围是怎样求出来的
尝试一
结果:部分通过,只通过了44%
public class Solution {
public int NumberOf1(int n) {
//用于表示n的二进制
int [] b=new int[32];
/*将n转换为二进制,并存入b中*/
if(n>0){
//y表示商
int y=n;
//i表示当前在b中的位置
int i=0;
do{
b[i]=y%2;
i++;
y=y/2;
}while(y>0);
}else if(n<0){
/*取反加一*/
int y=-n;
//i表示当前在b中的位置
int i=0;
do{
b[i]=y%2;
i++;
y=y/2;
}while(y>0);
//取反
for( i=0;i<b.length;++i){
b[i]= b[i]==0 ? b[i]|1 : b[i]&0;
}
//+1
addOne(b,0);
}
/*数一的个数*/
int count=0;
for(int i=0;i<b.length;++i){
if(b[i]==1){
count++;
}
}
return count;
}
public int[] addOne(int b[],int i){
if(b[i]==0){
b[i]=i+1;
return b;
}
b[i]=0;
return addOne(b,i+1);
}
}
分析:我处理的时候直接对符号位都进行处理了。那当然要错。并且,正数表示不了2147483648(-2147483648)
尝试二
结果:通过
public class Solution {
public int NumberOf1(int n) {
//用于表示n的二进制
int [] b=new int[32];
/*将n转换为二进制,并存入b中*/
if(n>0){
//y表示商
int y=n;
//i表示当前在b中的位置
int i=0;
do{
b[i]=y%2;
i++;
y=y/2;
}while(y>0);
}else if(-2147483648<n && n<0){
/*取反加一*/
//这里需要注意-2147483648这种特殊情况,因为正数表示不了2147483648
int y=-n;
//设置符号为
b[31]=1;
//i表示当前在b中的位置
int i=0;
do{
b[i]=y%2;
i++;
y=y/2;
}while(y>0);
/*取反,符号位不处理*/
for( i=0;i<b.length-1;++i){
b[i]= b[i]==0 ? b[i]|1 : b[i]&0;
}
//+1
addOne(b,0);
}else if(n==-2147483648){
//-2147483648我直接是知道的
return 1;
}
/*数一的个数*/
int count=0;
for(int i=0;i<b.length;++i){
if(b[i]==1){
count++;
}
}
return count;
}
public int[] addOne(int b[],int i){
if(b[i]==0){
b[i]=b[i]+1;
return b;
}
b[i]=0;
return addOne(b,i+1);
}
}
结论
- java中int的表示范围是(-231~231-1,即-2147483648~2147483647)