给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2] 输出: 3
示例 2:
输入: [0,1,0,1,0,1,99] 输出: 99
解题思路——
1. 这里要用到位操作的概念,按位与操作&,按位或操作|,异或操作^.
2. 在你了解上面操作之后,明确一下下面算法的思路。这个数组有3*n + 1的数字,那么就把他们转化为长度为32位的2进制,就必然存在3*x的1,3*y的0,其中x + y = 32 * n.因为比如说n=1,就是数组有4个数字,那么有三个相同的数字,每个数字表示成2进制,就是相当于有3个32位的二进制数一样,而且每一位都是一样的。
哎哟,反正你这边理解就行了,要把这些数字都理解成是32位的2进制编码就行了。
3. 然后你相信,如果不看哪个特殊的数字,那么显然,1的总数量和0的总数量一定是3的倍数对不对?
4. 但是实际上,1和0的总数量不一定是3的倍数,为什么?就是因为那个特殊的不同的数字啊。
5. 好,如果我告诉你,32位的第5位,1的数量不是3的倍数,比如说1的数量是16,说明什么??没错,说明那个特殊数字的32位二进制表示的第5位是1.
6 按照这个思路,去理解代码吧。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int length = nums.size();
int result = 0;
for(int i=0;i<32;i++)
{
int mask = 1<<i;
int cnt = 0;
for(int j=0;j<length;j++)
{
if(mask & nums[j])
cnt++;
}
if(cnt%3)
result |= mask;
}
return result;
}
};