力扣每日一题:477. 汉明距离总和(位运算|中等)

126 阅读1分钟

477. 汉明距离总和

分类:

位运算 中等

题目:

477_1.PNG

收获:

  1. 纵向看待数列
  2. 开阔思路

代码:

由题目的数字范围可以知道10^9小于2^30,因此我们将数组横向看,可以对于数组中所有元素的每一数位分别进行统计,我们进而能够知道所有排列组合的可能也就是对于每一数位中的1与0中任意选择一个相互结合即为汉明距离,因此如果数位i上1的个数为k,数组总长度为n,那么数位i上的0的个数为(n-k),汉明距离为k(n-k)。

class Solution {
public:
    int totalHammingDistance(vector<int>& nums) {
        int count=0;
        int n=nums.size();
        for(int i=0;i<30;i++){
            int tmp=0;
            for(int val:nums){
                tmp+=(val>>1)&1;
            }
            count+=tmp*(n-tmp);
        }
        return count;
    }
};

复杂度:

477_2.PNG

创作不易,点个赞就是对作者最大的鼓励。

搜索公众号:菜鸟阿力

每天都会在公众号分享学习积累,欢迎关注~