Loading

477. 汉明距离总和

2021-05-28 LeetCode每日一题

链接:https://leetcode-cn.com/problems/total-hamming-distance/

标签:位运算

题目

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

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

输入: 4, 14, 2

输出: 6

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

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

解析

暴力破解,直接人没了。

在这里插入图片描述

所以不能暴力破解。观察规律

4   14   2
0 1 0 0   
1 1 1 0    
0 0 1 0
第一位有30
第二位有1021
第三位有2110
第四位有2011
所以这三个数的汉明距离总和就是1 * 2 + 2 * 1 + 2 * 1 = 6
即等于所有位01个数相乘的总和

编码

class Solution {
    public int totalHammingDistance(int[] nums) {
        int res = 0, len = nums.length;
        for (int i = 0; i < 32; i++) {
            int[] count = new int[2];
            // 计算所有数的第i位有几个1和几个0
            for (int j = 0; j < len; j++) {
                count[((nums[j] >> i) & 1)]++;
            }

            res += (count[0] * count[1]);
        }
        
        return res;
    }
}

在这里插入图片描述

时间复杂度O(C * n),C为数的位数,这里为32,空间复杂度O(1)

posted @ 2021-05-28 22:20  CodeTiger  阅读(47)  评论(0编辑  收藏  举报