您的位置:首页 > 编程语言 > C语言/C++

[LeetCode]137. Single Number II

2016-04-17 12:09 561 查看

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode single number c++