​LeetCode刷题实战477:汉明距离总和

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 汉明距离总和,我们先来看题面:

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

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

Given an integer array nums, return the sum of Hamming distances between all the pairs of the integers in nums.

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

给你一个整数数组 nums,请你计算并返回 nums 中任意两个数之间 汉明距离的总和 。

示例                         

示例 1:
输入:nums = [4,14,2]
输出:6
解释:在二进制表示中,4 表示为 0100 ,14 表示为 1110 ,2表示为 0010 。(这样表示是为了体现后四位之间关系)
所以答案为:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6

示例 2:
输入:nums = [4,14,4]
输出:4

解题

对每一个数的相同位置的上的二进制位进行判断,统计是1的个数cnt,那么为0的个数就是nums.size()-cnt,那么该二进制位就会形成cnt*(nums.size()-cnt)的汉明距离。

class Solution {
public:
    int totalHammingDistance(vector<int>& nums) {
        int cnt,ans=0;
        for(int i=0;i<32;i++){
            cnt=0;
            for(int j=0;j<nums.size();j++){
                if(nums[j]&1){
                    cnt++;
                }
                nums[j]>>=1;
            }
            ans+=cnt*(nums.size()-cnt);
        }
        return ans;
    }
};

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-460题汇总,希望对你有点帮助!

LeetCode刷题实战461:汉明距离

LeetCode刷题实战462:最少移动次数使数组元素相等 II

LeetCode刷题实战463:岛屿的周长

LeetCode刷题实战464:我能赢吗

LeetCode刷题实战465:最优账单平衡

LeetCode刷题实战466:统计重复个数

LeetCode刷题实战467:环绕字符串中唯一的子字符串

LeetCode刷题实战468:验证IP地址

LeetCode刷题实战469:凸多边形

LeetCode刷题实战470:用 Rand7() 实现 Rand10()

LeetCode刷题实战471:编码最短长度的字符串

LeetCode刷题实战472:连接词

LeetCode刷题实战473:火柴拼正方形

LeetCode刷题实战474:一和零

LeetCode刷题实战475:供暖器

LeetCode刷题实战476:数字的补数

281e2889dedf792fe7da6bf9e4dca26b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小猿666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值