消息关闭
    暂无新消息!
各位大哥,我在做leetcode上hamming distance那个题遇到点问题,题目大致要求是输入两个十进制的数,然后比较它们的二进制形式有多少位不一样。我的思路是把它们的二进制数分别按倒序的顺序排好,放在数组里,然后逐位比较,记录下有多少位不同。但是现在运行结果不正确,还请各位大哥帮忙看看,我的代码如下:
class Solution {
public: 
    int antibin[31]={0};
    int * transfer(int a)
    {
        int i=0,j=0;
        while(a>=1)
        {
            antibin[i]=a%2;
            a=a/2;
            i++;
        }
        return antibin;
    }

    int hammingDistance(int x, int y) {   
        int i=0,j=0;
     
        for(i=0;i<=30;i++)
        {
        if(*(transfer(x)+i)!=*(transfer(y)+i))  //不应该从前往后比,应该从后往前比
        {    
            j=j+1;    
        }
        }
        return j;
    }
    
   
};

5个回答

︿ 3
你的效率很低。
而且思路有问题。
你用antibin存2进制的数据。但是只有一个内存,当处理完x要比较y的时候缓冲区内容已经改变了
最后用*addr1  == *addr2 的时候两个地址其实是一样的。
int  a = transfer(x)+i;
int  b = transfer(y)+i
你在比较a,b 试试。
而且你辛辛苦苦算的x的二进制在下一次循环的时候还要再算一次。。。
而且你算的是31位 正常应该算32位
如果不用异或直接计算应该用类似下面的逻辑
while(x>0 || y>0){  //只支持正整数   x,y => unsigned int, 一直循环到都是0
   if( x&1!=y&1) cnt++;  // or x%2!=y%2
  x>>1;                 //右移一位。 如果到0右移仍然是0
  y>>1;
}
︿ 2
     uint i = 10; uint j =18;
     uint p = (i^j) ; //异或运算计算不同位为1
     uint c = 0;
     //计算有多少个1
     for(c = 0 ; p;c++)
     {
        p &=(p-1);//清楚最低位的1 计数加1
     }
︿ 0
二进制形式符号位不同算不算呢?建议二进制操作还是用位运算效率最高,这里最好就是用异或,查看结果中为1的个数。
︿ 0
个人建议,遍历两个十进制的每位,然后比较是否一样(每位做异或运算),再定义一个计数器,统计不一样的个数。