题目
给定一个无序整数数组,其中一个数只出现一次,其余数都出现三次,请找出只出现一次的那个数。
输入:第一行输入一个数N,表示数组的大小,接下来输入N个数,确保每个数都在int范围内。
输出:只出现一次的数。
思路
如果这道题描述的是其余数都出现2次,相信很多人都能够想到将所有数一起异或,最后的结果将是要求的那个数。但是这里讲的是出现三次,所以并不能用异或的方法将其余数抵消掉。这里可以用到二进制计数方法:由于题目明确了数的范围在int内,我们可以定义有32个元素的数组,然后将输入数组的每个数都化成二进制的形式。当某个位上的值为1时,在对应的数组上计数加1。所有的数都处理完毕之后,将这些计数数组都执行模3操作,此时计数数组上等于1的元素组成了题目要求的数。
代码
#include <iostream>
using namespace std;
int bits[32];
int main(){
int n, num;
cin >> n;
for(int i=0; i<n; i++){
cin >> num;
for(int j=0; num; j++){
bits[j] += num & 1;
num >>= 1;
}
}
int result = 0;
for(int i=31; i>=0; i--){
result <<= 1;
result += bits[i] % 3;
}
cout << result << endl;
return 0;
}