题干:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:
首先要明确一点,在计算机中数字都是以二进制来进行的,机器不认识整数,输入一个整数后,会自动转为二进制数在计算机中进行操作。且看到这个题目的后半句,负数用补码来表示,值得一提的是,在整个计算机中,数字的运算都是以补码来进行的。而正数的补码就是其本身,所以这道题这句话在这里相当于画蛇添足。下面给出具体的思路分析(一次性永远记忆即可):一个二进制数,减去1,再和其本身相与,就会将这个二进制数最右边的那个1变成0,重复这个过程就会把二进制数所有的1都变0,那么这个数也就变成了0,从而也就统计出了其中1的个数。具体代码见下:
public class Solution {
public int NumberOf1(int n) {
int count=0;
while(n!=0){
count++;
n=n&(n-1);
}
return count;
}
}
算法除了需要有时的灵光乍现之外,更多的是需要自身的积累。