Leetcode题解
leetcode(137)
题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
(1)纯属娱乐的解法:Hashmap的方式
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int,int> mp;
for(auto x:nums)
mp[x]++;
for(auto num:mp)
if(num.second == 1)
return num.first;
return -1;
}
};
(2)高级解法:位操作
将每个数想象成32位的二进制,对于每一位的二进制的1和0累加起来必然是3N或者3N+1, 为3N代表目标值在这一位没贡献,3N+1代表目标值在这一位有贡献(=1),然后将所有有贡献的位|起来就是结果。这样做的好处是如果题目改成K个一样,只需要把代码改成cnt%k。(leetcode某大佬原话)。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans=0;
for(int i=0;i<32;++i)
{
int sum=0;
for(auto num:nums)
sum+=(num>>i)&1;
ans|=(sum%3)<<i;
}
return ans;
}
};