【Leetcode】477. Total Hamming Distance

来源:互联网 发布:贵州云博大数据 编辑:程序博客网 时间:2024/05/02 02:53

方法一:

思路:

(1)遍历数组nums,对每一个nums[i],求其余后面的每一个nums[j]的Hamming Distance。

(2)求x与y的Hamming Distance的方法:

---1)先求x^y的结果res。

---2)再依次求32位res的每一位与1进行与操作的结果,若不为0,则Hamming Distance加一。

public class Solution {public int totalHammingDistance(int[] nums) {int len = nums.length;if (len == 0)return 0;int result = 0;for (int i = 0; i < len - 1; i++) {for (int j = i + 1; j < len; j++)result += hammingDistance(nums[i], nums[j]);}return result;}public int hammingDistance(int x, int y) {int res = x ^ y;int count = 0;for (int i = 0; i < 32; i++) {if ((res & 1) != 0)count++;res >>= 1;}return count;}}

超时!!!


方法二:

思路:

(1)设置变量oneCount记录某一位上1的个数,result记录总的Hamming Distance。

(2)依次判断32位中的每一位。每判断完一位,右移一位继续判断下一位。

(3)针对每一位,遍历nums数组,判断每一个nums[j]的该位是否为1(nums[j]与1进行与操作得到的结果不是0则nums[j]的该位为1,oneCount加一)。

(4)遍历完nums数组后,oneCount * (len - oneCount)即为该位上的Hamming Distance,加到总结果result中。

public class Solution {public int totalHammingDistance(int[] nums) {int result = 0, oneCount = 0, len = nums.length;for (int i = 0; i < 32; i++) {oneCount = 0;for (int j = 0; j < len; j++) {if ((nums[j] & 1) != 0)oneCount++;nums[j] >>= 1;}result += (oneCount * (len - oneCount));}return result;}}

Runtime:45ms
1 0
原创粉丝点击