题解 | #二进制中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; }