【Hamming Distance】-1(Java)

import java.lang.Math;
/**
 * Desc: Hamming Distance 汉明距离
 * 0.表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离
 * 1.汉明距离是以理查德·卫斯里·汉明的名字命名的。
 * 2.在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。
 *   换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。
 */
class Solution {
    public static void main(String[] args) {
        int distance = hammingDistance(1577962638, 1727613287);
        System.out.println(distance);
    }
    /**
     * 表示两个字x,y之间的汉明距离。对两个字符串进行异或运算
     * @param x
     * @param y
     * @return
     */
    public static int hammingDistance(int x, int y) {
        String bin_x = decimalToBinary(x);
        String bin_y = decimalToBinary(y);
        StringBuffer bin_z=new StringBuffer();
        //对两个数的二进制进行异或运算(相同为0 相异为1)
        int len = bin_x.length() > bin_y.length() ? bin_y.length() : bin_x.length();
        for (int i = 0; i < len; i++) {
            char r_x = bin_x.charAt(bin_x.length()-i-1);
            char r_y = bin_y.charAt(bin_y.length()-i-1);
            int r_z = r_x != r_y ? 1 : 0;
            bin_z.insert(0,r_z);
        }
        String s=bin_x.length() > bin_y.length() ? bin_x: bin_y;
        while(len<s.length()){
            bin_z.insert(0,s.charAt(s.length()-len-1));
            len++;
        }

        //统计结果为1的个数
        int include = 0;
        int t=0;
        while (t < bin_z.length()) {
            char r_z =bin_z.charAt(t);
            if (r_z == '1') {
                include++;
            }
            t++;
        }
        return include;
    }


    /**
     * 十进制转二进制
     * @param n
     * @return
     */
    public static String decimalToBinary(int n) {
        //分析 10进制转二进制的过程
        int r = 0;
        StringBuffer bin =new StringBuffer();
        int t = 0;
        while (n != 0) {
            r = n % 2;
            n = n / 2;
            bin.append(r);
            t++;
        }
        return bin.reverse().toString();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值