只出现一次的数字(Leetcode)
刷这道137. 只出现一次的数字 II的时候,因为最近刚把redis学了,所以第一反应是Bitmap
,虽然一开始就跑偏了,但还是学到了一些东西
首先是golang实现Bitmap
,可以参考下面这篇文章,写的还是很详细的,也有代码,注意判断该位是否存在时(bitmap.words[word]&(1<<bit)) != 0
不要想当然把()!=0
改为()==1
。当这一位存在时,会一位与运算而只剩下这一位,也就是非0,但并不一定是1。当然也可以选择bitmap
右移( (bitmap.words[word]>>bit) & 1 ) != 0
这种的话就肯定是1或0了
另外这个既然是一个系列,就全做了做,136. 只出现一次的数字,其他的数字出现了两次,这道题相对简单,A^A=0, 0^A=A
,那么我们只需要把所有数都进行异或,成对的会自然变为0,剩下的就是答案了
然后回到出现三次的题目,答案的第二种方法还是很巧妙的,直接与3求余判断出现次数,但对于go来说要注意int
一般是64位的(看电脑),如果我们用64位的数字,并且i只遍历到32位会导致符号位没法算上,也就是负数为答案的情况下会出错,可以考虑统一换成32位的,也可以让i遍历到64位。
至于第三题只出现一次的数字 III,第一个题解采用分治的思想将问题降维就很巧妙,主要就是把二者分开,转换为136题这种。
另外记录一下,计算机在进行位运算时是按照补码进行计算的。
评论
评论插件加载失败
正在加载评论插件