《Total Hamming Distance》题目分析
这道题的暴力算法比较容易想到:枚举两个整数,然后看有几个二进制位不同。如果我们把32个二进制位看成是常数,那么时间复杂度是O(N^2)
的。
标程的做法是按位来做。对于每一个二进制位,统计一下N
个数中,有几个在这一位是0,有几个在这一位是1。假设有x
个是0,y
个是1,那么在这一位的产生的距离就是xy
。如果我们把32个二进制位看成是常数,那么时间复杂度是O(N)
的。
这道题的暴力算法比较容易想到:枚举两个整数,然后看有几个二进制位不同。如果我们把32个二进制位看成是常数,那么时间复杂度是O(N^2)
的。
标程的做法是按位来做。对于每一个二进制位,统计一下N
个数中,有几个在这一位是0,有几个在这一位是1。假设有x
个是0,y
个是1,那么在这一位的产生的距离就是xy
。如果我们把32个二进制位看成是常数,那么时间复杂度是O(N)
的。
import java.util.Scanner;
public class Main { public static void main(String[] args) { Main solution = new Main(); Scanner in = new Scanner(System.in); int N = in.nextInt(); int[] nums = new int[N]; for(int i = 0; i < N; i++) nums[i] = in.nextInt(); System.out.println(solution.helper(nums)); } private int helper(int[] nums){ int bit = 1,res = 0,count = 0; //每一位去与运算 while(count < 32){ int one = 0,zero = 0; for(int x : nums){ if((bit & x) == 0) zero++; else one++; } res += one * zero; bit <<= 1; count ++; } return res; } }
答案超过整形范围
阿哈,谢谢你
class solution{ int totalhammingdistance(vector &nums) { int res=0; int cnt=0; n=nums.size(); for(int i=0;i>1)) ++cnt; } } return cnt; } };
class Solution { public: int totalHammingDistance(vector& nums) { int res = 0, n = nums.size(); for (int i = 0; i < 32; ++i) { int cnt = 0; for (int num : nums) { if (num & (1 << i)) ++cnt; } res += cnt * (n - cnt); } return res; } };
能帮忙删除吗?发表错了
没事,反正也不是最优解
为什么是80呢?什么地方没有考虑到吗?