给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2] 输出: 3
示例 2:
输入: [0,1,0,1,0,1,99] 输出: 99
思路:
和之前的其他元素均出现两次相比,不能用异或的方法去得到该元素。其实相同的元素在某一位上面都是相同的,对于所有数字的某一位来说,那么必然是3n+1个二进制位,n为出现三次的元素数量,在3n+1中有3x个0,3y个1,x+y=n。
剩下一个目标元素不确定是0或者1。观察可以发现,如果目标元素在该位上为1,那么1的个数为3x+1模3之后余1,说明目标元素在该位上的值为1.根据这个特点可以通过遍历32次全数组构建出目标元素的值。
Code:
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]) //统计有1的个数
cnt++;
}
if(cnt%3) //不能整除说明在该位为1
result |= mask;
}
return result;
}
};