参考题解:官方题解
题目:
标签:
- 位运算。
- 意想不到。
- 数学。
思路:
- 这道题和前面的一道题,汉明距离,是比较相关的。但是,那道题的方法如果直接拿过来用,会超时的。暴力法。但是需要使用 Integer.bitCount() 方法,才能暴力法,不然时间和空间都会超。
- 数学方法:针对32位的 Int 的每一位统计 1 的个数。两两之间的不同位置之和为 c * (n - c),其中 c 是 1 的个数,n - c 是 0 的个数。
题解:
-
第一种题解:暴力法。
-
class Solution { public int totalHammingDistance(int[] nums) { ArrayList<Integer> arrayListA = new ArrayList<>(); int length = nums.length, res = 0; for (int i = 0; i < length - 1; ++i) { for (int j = i + 1; j < length; ++j) { res += Integer.bitCount(nums[i] ^ nums[j]); } } return res; } }
-
第二种题解:数学方法。
-
class Solution { public int totalHammingDistance(int[] nums) { int ans = 0, n = nums.length; for (int i = 0; i < 30; ++i) { int c = 0; for (int val : nums) { c += (val >> i) & 1; } ans += c * (n - c); } return ans; } }