Description
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)
解法
先上代码:
public int singleNumber(int[] nums) {
int first=0, second=0;
for(int i=0; i<nums.length; i++) {
first = (nums[i] ^ first) & ~second;
second = (nums[i] ^ second) & ~first;
}
return first;
}
这道题可以这么理解:
每个数字出现三次即将其清零,最后剩下出现一次的就是结果。即00(0次)>10(1次)>01(2次)>00(3次)。
first表示:第一次出现该数的时候存入first。
second表示:这个数第二次出现,将first置零,second置1。
如果数第三次出现,它会尝试存入first,可是~second为0,所以存不上,此时first,second全部置空,这个数相当于没出现。