ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

DeepSeek LeetCode 477. 汉明距离总和 Java实现

DeepSeek    LeetCode 477. 汉明距离总和 Java实现

思路

按位统计:两个数在某一位上不同,这一位就对汉明距离贡献 1。

对于第 i 位:

· 统计 nums 中该位为 1 的个数 ones
· 该位为 0 的个数为 n - ones
· 任意一个「1」和一个「0」的组合都会在这一位上产生 1 个距离,所以这一位对总和的贡献是 ones * (n - ones)

把所有位(题目数据 nums[i] <= 10^9 < 2^30,遍历 0~30 位即可)的贡献累加。

Java 实现

classSolution{publicinttotalHammingDistance(int[]nums){intn=nums.length;longans=0;for(inti=0;i<31;i++){intones=0;for(intx:nums){ones+=(x>>i)&1;}ans+=(long)ones*(n-ones);}return(int)ans;}}

复杂度分析

· 时间复杂度:O(31 * n),即 O(n),n 为数组长度。
· 空间复杂度:O(1)。

细节说明

  1. 为什么是 31 位? nums[i] <= 10^9,约 2^30,取 31 位(0~30)足够覆盖。
  2. 为什么中间用 long? ones * (n - ones) 最大约为 n^2/4,当 n = 10^4 时约 2.5 * 10^7,再乘位数仍可能接近 int 上限,使用 long 累加避免溢出。
  3. 与暴力 O(n^2) 两两比较相比,按位统计是本题的标准最优解。

示例

输入: nums = [4, 14, 2] 输出: 6 二进制: 4 = 0100 14 = 1110 2 = 0010

逐位看:

· 第 1 位:1 的个数 2,0 的个数 1 → 2×1 = 2
· 第 2 位:1 的个数 2,0 的个数 1 → 2
· 第 3 位:1 的个数 1,0 的个数 2 → 2
· 其余位全为 0 → 0

总和 = 2 + 2 + 2 = 6 ✓

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进