总结:不要一味的只知道用十进制的数或者转字符串去比较,要学会用二进制数去思考解决问题
package com.leetcode.easy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 〈461. 汉明距离〉
* 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
* <p>
* 给出两个整数 x 和 y,计算它们之间的汉明距离。
*
* @author PitterWang
* @create 2020/5/12
* @since 1.0.0
*/
public class HammingDistance {
public static void main(String[] args) {
System.out.println(hammingDistance(5, 8));
System.out.println(hammingDistance1(5, 8));
System.out.println(hammingDistance2(5,8));
System.out.println(hammingDistance3(5,8));
}
/***
* ①将x,y按位异或得到i
* ②然后遍历i中有多少个1
* @param x
* @param y
* @return
*/
public static int hammingDistance(int x, int y) {
int i = x ^ y;
int count = 0;
while (i != 0){
if(i % 2 == 1){
count ++;
}
i = i / 2;
}
return count;
}
/***
* ①将x,y按位异或得到i
* ②当i不为0时,将i与1按位与,判断二进制末尾是不是1,是,count++
* ③将i右位移一位,在进行判断
* @param x
* @param y
* @return
*/
public static int hammingDistance1(int x, int y) {
int i = x ^ y;
int count = 0;
while (i != 0) {
if ((i & 1) == 1) {
count++;
}
i = i >> 1;
}
return count;
}
/**
* 将x,y按位异或,然后判断位置是1的个数
* @param x
* @param y
* @return
*/
public static int hammingDistance2(int x, int y) {
return Integer.bitCount(x ^ y);
}
/***
* 自己思路:
* 先把数字转成二进制逆序
* 然后进行比较
* @param n
* @param m
* @return
*/
public static int hammingDistance3(int n, int m) {
if (n < m) {
m = m + n;
n = m - n;
m = m - n;
}
List<Integer> list = new ArrayList<>();
int i;
for (int j = n; n != 0; ) {
i = n % 2;
n = n / 2;
list.add(i);
}
List<Integer> list2 = new ArrayList<>();
int ii;
for (int j = m; m != 0; ) {
ii = m % 2;
m = m / 2;
list2.add(ii);
}
int bak = 0;
for (int k = 0; k < list.size(); k++) {
if (k < list2.size()) {
if (!list.get(k).equals(list2.get(k))) {
bak++;
}
} else {
if (list.get(k).equals(1)) {
bak++;
}
}
}
return bak;
}
}