137. Single Number II
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
分析
这个题目是[136.Single Number]的变形,现在重复数出现奇数次了,之前的异或操作就失效了,但仍然想通过位操作来解决这个问题。可以这样想象将每个数都展开成二进制形式,比如[5,3,3,3,4,4,4]
0000,0101
0000,0011
0000,0011
0000,0011
0000,0100
0000,0100
0000,0100
那么每一位上出现1的次数应该是3的倍数要么是3的倍数多1,所以可以统计每位上1的个数。
另一种方法是使用一个哈希表记录每个数出现次数。
源码
方法一:统计每位上1的个数
int singleNumber(vector<int>& nums) {
int width = sizeof(int);
int *count = new int[width];
for(auto num : nums) {
for(int j = 0; j < width; j++){
count[j] += (num >> j) & 1;
count[j] %= 3;
}
}
int ret = 0;
for(int i = 0; i < width; i++){
ret += (count[i] << i);
}
delete[] count;
return ret;
}
方法二:使用哈希表
int singleNumber(vector<int>& nums) {
unordered_map<int,int> counts;
for(auto num : nums){
if(counts.find(num) != counts.end())counts[num]++;
else counts[num] = 1;
}
for(auto count : counts) {
if(count.second == 1) return count.first;
}
}