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

相关推荐

评论
1
收藏
分享
牛客网
牛客企业服务