描述
输入一个整数 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)