三种方法
方法一:
我的思想:
针对x和y分别设置一个数组来保存他们的二进制,再对这个二进制进行比较,但是我的代码样例没有完全通过。我的代码如下
class Solution {
public int hammingDistance(int x, int y) {
int a = Math.max(x, y);
int[] xnums = new int[a];
int[] ynums = new int[a];
int diff = 0;
double x11 = (int) Math.log(x)/Math.log(2);
int x1 = (int) x11;
double y11 = Math.log(y)/Math.log(2);
int y1 = (int) y11;
for(int i = x1; i >= 0; i--){
if(x / Math.pow(2,i) == 1){
xnums[i] = 1;
x -= Math.pow(2,i);
}
}
for(int j = y1; j >= 0; j--){
if(y / Math.pow(2,j) == 1){
ynums[j] = 1;
y -= Math.pow(2,j);
}
}
for( int k = 0; k < a; k++){
if(xnums[k] != ynums[k]){
diff++;
}
}
return diff;
}
}
不知道为啥没过全部的样例…
然后分析主要是一些整型和浮点型的转换造成的误差导致错误
改正后,通过了样例
改正后的代码:
class Solution {
public int hammingDistance(int x, int y) {
if(x == 0 && y == 0) return 0;
int x1 = (int) (Math.log(x)/Math.log(2));
int y1 = (int) (Math.log(y)/Math.log(2));
int a = Math.max(x1, y1);
int[] xnums = new int[a+1];
int[] ynums = new int[a+1];
int diff = 0;
for(int i = x1; i >= 0; i--){
if(x / (int)Math.pow(2,i) == 1){
xnums[i] = 1;
x -= Math.pow(2,i);
}
}
for(int j = y1; j >= 0; j--){
if(y / (int)Math.pow(2,j) == 1){
ynums[j] = 1;
y -= Math.pow(2,j);
}
}
for( int k = 0; k <= a; k++){
if(xnums[k] != ynums[k]){
diff++;
}
}
return diff;
}
}
方法二
看了官方题解之后,才发现还有java异或运算符(知识匮乏了…)
长见识了…
class Solution{
public int hammingDistance(int x, int y){
int s = x ^ y;
int ret = 0;
while(s > 0){
ret += s & 1;
s >>= 1;
}
return ret;
}
}
方法三
大体思想:
- 在不知道异或运算符的情况下感觉是最优的解决办法
- 利用模2来判断二进制的最低位是0还是1
- 利用整除来进位
class Solution{
public int hammingDistance(int x, int y){
int ret = 0;
while(x != 0 || y != 0){
if((x%2) != (y%2)){
ret++;
}
//System.out.printf("%d,%d,%d\n",ret,x,y);
x /= 2;
y /= 2;
}
return ret;
}
}
打卡打卡耶耶耶!!!!!!!!!