Day18: 二进制中1的个数

46 阅读1分钟

描述

输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。

数据范围:- 2^{31} <= n <= 2^{31}-1−231<=n<=231−1

即范围为:-2147483648<= n <= 2147483647−2147483648<=n<=2147483647

示例1

输入:

10

返回值:

2

复制

说明:

十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。       

示例2

输入:

-1

返回值:

32

说明:

负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1    
public class Solution {
    public static int NumberOf1(int n) {
    //特殊值直接返回
         if(n == -2147483648){
            return 1;
        }
        int num[] = new int[32];
        int ans = 0;
        //如果是负数并且是奇数ans从33开始减
        if (n < 0 && n % 2 != 0)
            ans = 33;
        //如果是负偶数从32开始减
        else if (n % 2 == 0 && n < 0)
            ans = 32;
        //利用数组储存    
        for (int i = 0; i < num.length; i++) {
            num[i] = (int) Math.pow(2, 31 - i);
        }
        if (n > 0) {
            for (int i = 0; i < num.length; i++) {
                if (n >= num[i]) {
                    ans++;
                    n = n - num[i];
                }
            }
        } else {
            n = -n;
            for (int i = 0; i < num.length; i++) {
                if (n >= num[i]) {
                    n = n - num[i];
                    ans--;
                }
            }
        }
        return ans;
    }
}

时间复杂度:O(n) 空间夫扎渡:O(n)