题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
解法一:排序后遍历比较
把数组先排序,因为数字要么同时出现3次,要么就出现一次就这两种可能。然后前后两个数字比较。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int len = nums.size();
sort(nums.begin(),nums.end());
int i;
for(i = 0 ; i < len ; i += 3)
{
if(nums[i] != nums[i+1])
{
return nums[i];
}
}
return nums[i];
}
};
解法二:位运算
看了网上的大神的解法,看了好半天才懂,因为数字要么同时出现3次,要么就出现一次就这两种可能,所以对每个数的2进制数的位进行遍历,如果唯一的数的那一位是1,那么出现所有数的那一位出现1的次数加起来是3的倍数加1,就要对那个数进行还原,如果唯一的数那一位是0,那么出现所有数的那一位出现1的次数加起来是3的倍数。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int len = nums.size();
int ans = 0;
int count = 0;
for(int i = 0; i < 32; i++) //整数有32位
{
count = 0;
for(int j = 0; j < len; j++) //对每一个数遍历
{
if( ((nums[j]>>i) & 1) != 0)
{
count++;
}
}
if(count % 3 != 0) //如果是3的倍数加1,唯一出现的数这一位是1,进行还原
{
ans |= 1<<i;
}
}
return ans;
}
};