leetcode#137 Single Number II
Given an array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
解释
给定一个整数数组,数组中只有一个元素出现了一次,其余元素都出现了三次,要求找出仅出现一次的元素。
时间复杂度要求O(N),空间复杂度尽量O(1)。
我的解法
如果不求空间复杂度O(1),那么还是可以使用HashMap,Key存储数组元素值,Value存储元素出现的次数,最后判断元素出现次数为1的,返回其Key值。
|
|
大神解法
解法一:
神奇的方法……:a = (a XOR x) & ~b 且 b = (b XOR x) & ~a ,最后返回a 。
有人解释如下:
First time number appear -> save it in “ones”
Second time -> clear “ones” but save it in “twos” for later check
Third time -> try to save in “ones” but value saved in “twos” clear it.
这么解释,那么就类似于leetcode136中,利用异或寻找仅出现一次元素的方法了:每个等式的前半部分a XOR x 用于确定a 中的元素是否与当前的数组元素相等,相等当然是置为0;后半部分的~b 用于保存之前是否出现过当前数组元素的状态,如果有,那么会置为1——之后再次调用a = (a XOR x) & ~b 的时候,就会使得a = 0 。
|
|
解法二:
位运算
|
|
总结
位运算真的是太难懂的……