leetcode 477. Total Hamming Distance

1.题目

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

Now your job is to find the total Hamming distance between all pairs of the given numbers.
汉明距离:两个整数的二进制表示中不同位的数量
给一个列表的数字,求这些数字两两之间的汉明距离和。

Example:
Input: 4, 14, 2

Output: 6

4 is 0100, 14 is 1110, and 2 is 0010
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.

2.分析

首先,如果真的一对对计算汉明距离,结果肯定超时。所以要考虑另外的方式。
题目假设所有数字都在INT32范围内。也就是32个bit位。从每个bit位来考虑。
例如,最低bit位,对于列表A中的每个数字:
统计该位为1的有x个,为0的有(n-x)个。
那么这一bit位贡献的汉明距离为(n-x)*x, 因为该bit为0或为1的数字共有(n-x)*x中组合
按照上面的方法,依次计算其他bit位

3.代码

int totalHammingDistance(vector<int>& nums) {
    int ans = 0;
    for (int i = 0; i < 32; i++) {
        int count = 0;
        for (int n : nums) {
            count += (n >> i) & 1;
        }
        ans += (nums.size() - count)*count;
    }
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值