题目
Given an array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
给定整数数组,每个元素出现三次,除了一个,出现一次。 找到那个单一的。
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
注意:算法应该具有线性运行时的复杂性。 你可以实现它而不使用额外的内存吗?
分析
将数组中每个元素认定为一个 32 位的二进制数,这样每一位只可能是 0 或 1 。
对于整个数组,统计每一位上 1 出现的次数,必定是 3N 或 3N + 1 次。将这个次数对 3 取模,即可获得只出现一次的元素在该位上的值(0 huo 1)。
代码
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int singleNumber(vector<int>& nums) {
int number = 0;
for (int i = 0; i < 32; i++) {
int count = 0;
int temp = 1 << i;
for (int j = 0; j < nums.size(); j++) {
if (nums[j] & temp)
count++;
}
if (count % 3)
number |= temp;
}
return number;
}
};
int main() {
int num[] = {1, 1, 1, 2, 3, 3, 3};
int length = sizeof(num) / sizeof(int);
vector<int> nums(num, num + length);
Solution solution;
int number = solution.singleNumber(nums);
cout << "The single number is " << number << endl;
}
真值表解法
CSDN 博客:http://blog.csdn.net/yutianzuijin/article/details/50597413