给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
这种纯数字计算的问题,如果我们只用加减乘除就能做出来,那leetcode就太low了,这种问题,应该深入到位级别运算。
思考,将int数分为32位,那么按该题的要求,这32位的每一位,所出现过的数目必定是3N或3N+1,3N+1的位级必然是那唯一的一个元素贡献的。对int数res的每个位进行数组位与遍历,出现3N+1的即保留下来,最终刷完32位之后,可得结果。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int length = nums.size();
int result = 0;
for(int i = 0; i<32; i++){
int count = 0;
int mask = 1<< i;
for(int j=0; j<length; j++){
if(nums[j] & mask)
count++;
}
if(count %3)
result |= mask;
}
return result;
}
};