【剑指offer】输入一个整数,输出该数二进制表示中1的个数,其中负数用补码表示。

题目要求

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

核心思路

  1. 如果一个整数不为0,那么这个整数至少有一位是1,如果把这个整数减1,那么原来整数最右边的1就会变为0,原来在1右边的所有0都会变为1。那么,利用n = n & (n - 1),如1100 & 1011 = 1000,也就是说,把整数减1,再和原数进行与运算,就会消去一个1。利用这个特性我们就可以算出1的个数。
  2. 把整数转换为二进制字符串,把字符串转为char数组,再进行遍历计算。

完整代码如下

/**
 *输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 
*/
public class Solution {
	//核心思想:n = n & (n-1)
	public int NumberOfOne1(int n) {
		if(n == 0) 
			return 0;
		int count = 0;

		while(n != 0) {
			n = n & (n-1);
			count++;
		}
		
		return count;
	}
	//核心思想:字符串数组
	public  int NumberOfOne2(int n) {
		 int count = 0;
		 char[] charArray = Integer.toBinaryString(n).toCharArray();
		 for (int i = 0; i < charArray.length; i++) {
			 if (charArray[i] == '1') {
				 count++;
		}
		}
	  return count;
	}

	public static void main(String[] args) {
		Solution sl = new Solution();
		System.out.println(sl.NumberOfOne1(5));
		System.out.println(sl.NumberOfOne2(5));
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42967016/article/details/85077429