题解 | #二进制中1的个数#
二进制中1的个数
http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8
思路
思路很简单,就是将十进制数转换成二进制数,存放到一个byte数组种,需要注意的是,负数最高位为1,正数最高位为0.
结果
运行时间:15ms
占用内存:10552KB
代码
public int NumberOf1(int n) {
/*StringBuilder binaryNum = new StringBuilder();
int decNum = n;
while (n > 0){
if (n % 2 == 0) binaryNum.insert(0,0);
else binaryNum.insert(0,1);
n>>=1;
}
System.out.println(binaryNum);
return 0;*/
//long startTime = System.currentTimeMillis();
// 用于存储十进制转换成二进制后的数据
byte[] binaryNumsArray = new byte[32];
// 正数(true) 负数(false)
boolean moreThanZero = true;
// 判断,置最高位(符号位)
if (n < 0) {
binaryNumsArray[0] = 1;
n = n * -1;
moreThanZero = false;
}
int index = 31; // 对应数组下标,进行赋值
int remember = 0; // 记录1的个数
// 除2取余法 获取十进制的二进制数
while (n > 0){
if (n % 2 == 0) binaryNumsArray[index--] = 0;
else {
binaryNumsArray[index--] = 1;
// 记录位为1的个数
remember++;
}
n>>=1;
}
// 如果n是正数,那么直接返回1个个数
if (moreThanZero) return remember;
// n为负数,那么就置0,重新记录
remember = 1;
// 按位取反
for (int i = 1; i < binaryNumsArray.length; i++) {
binaryNumsArray[i] = (byte) (binaryNumsArray[i] == 0?1:0);
}
// 加一求补码
int carry = 1;
for (int i = binaryNumsArray.length - 1; i > 0; i--) {
// 判断是否该位为1
if ((binaryNumsArray[i] == 0 && carry == 1) || (binaryNumsArray[i] == 1) && carry == 0) remember++;
binaryNumsArray[i]+=carry;
carry = 0;
if (binaryNumsArray[i] == 2){
binaryNumsArray[i] = 0;
carry = 1;
}
}
System.out.println(Arrays.toString(binaryNumsArray));
/*long endTime = System.currentTimeMillis();
System.out.println("my=>" + (endTime - startTime) + "ms");*/
return remember;
}
海康威视公司福利 1125人发布