leetcode 477. 汉明距离总和 击败97.79%

两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。

计算一个数组中,任意两个数之间汉明距离的总和。

示例:

输入: 4, 14, 2

输出: 6

解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系) 所以答案为:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14,
2) = 2 + 2 + 2 = 6. 注意:

数组中元素的范围为从 0到 10^9。 数组的长度不超过 10^4。

 public int totalHammingDistance(int[] nums) {
       if (nums.length < 2) {
            return 0;
        }
        int sum = 0;
        //范围小于2的30次方,所以只需要对后30位计算
        int count = 30;
       while (count-- > 0) {
       //逐位进行计算
            int ones = 0;
            for (int i = 0; i < nums.length; i++) {
            //判断整个数组在该位上有多少个1
                ones+=(nums[i] & 1);
                nums[i] >>= 1;
            }
            //在这一位上的距离总和是出现1的次数*出现0的次数
            sum += ones * (nums.length - ones);
        }

        return sum;
    }

整个思想就是对整个数组元素,每次对其中1位进行计算,因为不同位之间不会相互影响,比双重循环整体判断更快

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值