【Leetcode】477. Total Hamming Distance

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 超时

你可能感兴趣的:(【Leetcode】477. Total Hamming Distance)