题意:大致题意都是给定若干数据,其中部分数据出现x次,部分数据出现y次,找出出现y次的数据集。
其他出现3次,1个出现1次
直接统计每一位的出现次数
int singleNumber(vector<int>& nums) {
vector<int> counts(32);
for(int num : nums) {
for(int j = 0; j < 32; ++j) {
counts[j] += num & 1;
num >>= 1;
}
}
int res = 0;
for(int i = 31; i >= 0; --i) {
res <<= 1;
res |= counts[i] % 3;
}
return res;
}
其他出现2次,2个出现1次
先获取orsum,然后将orsum分组,这里选取的是最低位的1,构造出这个1必须由一个0一个1,所以0和1两种情况的数据分成两组
vector<int> singleNumbers(vector<int>& nums) {
int orsum = 0;
for (int n : nums)
orsum ^= n;
int div = 1;
while (!(div & orsum))
div <<= 1;
int a = 0, b = 0;
for (int n : nums)
if (div & n) a ^= n;
else b ^= n;
return {a, b};
}