1 求hamming distance: 先都转换成二进制,然后调用xor函数,最后统计1的个数
2 input的两两组合:O(N**2),超时
3 collections.Counter(string) 参数可以是string
4 total += collections.Counter(str(bin(nums[i]^nums[j])))["1"],使用Counter计数时,里面的参数一般是string。在这里因为我们要统计binary code中1的个数,所以有调用bin函数,然后用str函数转换成string,最后再取['1']的个数
5 另外一种方法:假如输入有四个number,它们的最后一位分别为1,1,0,0,则对于这四个最后一位来说,总的hamming distance是4,即1的个数乘以0的个数,同理,对于其他位的hamming distance,也可以用同样的方法来解
6 string operation比bit shift快些,maybe因为string只要建立了,只需要读string里面的值就行了
7 xmap = map('{:032b}'.format, nums)将nums中的所有num转换成32位unsigned number,因为需要将所有num都转换成一样的长度。同时直接转换成了字符串,方便后面数1的个数
8 题目中element属于范围[0, 10^9],所以用32bit来表示才足够
9 for b in zip(*xmap) 在这句code中,zip中是unpacked的individual字符串,每一个individual字符串是32长度的num转换来的,这样在每一次for循环中,b先取每个字符串的第一位,这样b的长度就是32的tuple,然后调用tuple.count()。
10 这里开始并不明白为什么要使用zip函数,后来才明白,原来zip中是一个个string,我们需要分别取每个string的相应位组合起来,而for b in zip是可以做到的
total, N = 0, len(nums)
xmap = map('{:032b}'.format, nums)
for b in zip(*xmap):
one = b.count('1')
total += one*(N-one)
return total
Time complexity: O(i)
Space complexity: O(1)
1 zip用在这里错误,很多组合会被miss掉
1 超时