解题思路:时间复杂度O(
l
o
g
2
C
log_2C
log2C)C是数据范围,最多31,表示二进制的位数,空间复杂度O(
1
1
1)
法一是调用函数来统计1的个数
如果不能用函数呢?我们自己如何实现相同效果?
代码
通过位移操作,不断取x和y的最低位进行比较,如果不一样就统计
classSolution{publicinthammingDistance(int x,int y){int ans =0;//计数while(x!=0|| y!=0){//只要x或y都不是全0,就继续
ans +=(x &1)!=(y &1)?1:0;//x和y都取最低位,如果不一样,ans+1,否则ans+0
x >>=1;//统计最低位后,右移一位,将最低位移走,下一次比较最低位的高位
y = y>>1;}//下面代码是上面代码的简化版// for(int i = 0;i<32;i++){//题目规定每个二进制有32位// int i1 = x >> i & 1;//让当前为移到最低位后通过&1操作取出// int i2 = y >> i & 1;// if (i1!=i2) ans++;//如果取出的最低位不一样,就ans+1// }return ans;}}
classSolution{publicinthammingDistance(int x,int y){int ans =0;//计数int i = x ^ y;//异或,不同位会置为1while(i!=0){//只要还有1就继续
ans += i&1;//取最低位,是1就ans+1,否则ans+0
i>>=1;//右移一位,将当前已经处理的最低位抛弃}return ans;}}
3. Brian Kernighan算法
解题思路:时间复杂度O(
l
o
g
2
C
log_2C
log2C)C是数据范围,最多31,表示二进制的位数,空间复杂度O(
1
1
1)