给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
这个题比之前136题只出现一次的数字要难很多,那个题是利用异或消除掉偶数次的数字,这个题更复杂一些,由于是奇数次,所以需要两个数来计数,要求是第一次遍历到为状态01(实际是扩展到多个位),第二次遍历到为10,第三次遍历到为00,公式如下:
b = b xor r & ~a;
a = a xor r & ~b;
b是低位,a是高位,这样最后输出b即为只出现一次的数字。
C++源代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int a=0, b=0;
for(int i=0;i<nums.size();i++){
b = (b ^ nums[i]) & ~a;
a = (a ^ nums[i]) & ~b;
}
return b;
}
};
python3源代码:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
a = 0
b = 0
for i in nums:
b = b ^ i & ~a
a = a ^ i & ~b
return b