(剑指offer)二进制中1的个数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/84697583

时间限制:1秒 空间限制:32768K 热度指数:298520

题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

注意
题目说的不太明确,确切的说应该是对一个整数来说,在32位计算机中存储的补码形式中1的个数。也就是说一定要把一个数化为32位的二进制补码。。

思路1:移位和1与运算,对每一位进行判断是0还是1。

public class Solution {
    public int NumberOf1(int n) {
        int sum = 0;
        for(int i = 0; i < 32; i++){
            if((n>>i & 1) == 1){
                sum++;
            }
        }
        return sum;
    }
}

思路2:调用Java的API

public class Solution {
     public int NumberOf1(int n) {
         return Integer.bitCount(n);
	}
}

思路3:调用Java的API

public class Solution {
     public int NumberOf1(int n) {
         String str = Integer.toBinaryString(n);
         int sum = 0;
         for(int i = 0; i < str.length(); i++){
             if(str.charAt(i) == '1'){
                 sum++;
             }
         }
         return sum;
	}
}

思路4:利用整数二进制补码的求法求解
(笔者觉得思路可以,但通不过。。)

public class Solution {
     public static int NumberOf1(int n) {
	        int[] a = new int[33];
	        int cnt = 0;
	        int sum = 0;
	        int nn = n;
	        if(n<0){
	            nn = -n;
	        }
	        while(nn>0){
	            a[cnt] = nn%2;
	            if(a[cnt]==1){
	                sum++;
	            }
	            cnt++;
	            nn /= 2;
	        }
	        if(n>=0){
	            return sum;
	        }else{
	            sum = 0;
	            for(int i = 0; i <= 30; i++){
	                if(i>=cnt){
	                    a[i] = 0;
	                }
	                if(a[i] == 1){
	                    a[i] = 0;
	                }else{
	                    a[i] = 1;
	                }
	            }
	            a[0] += 1;
	            a[31] = 1;
	            for(int i = 0; i <= 31; i++){
	                if(a[i] >= 2){
	                    a[i] -= 2;
	                    a[i+1] += 1;
	                }
	                if(a[i] == 1){
	                    sum++;
	                }
	            }
	            return sum;
	        }
	    }
}

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/84697583