剑指 Offer 56 - I. 数组中数字出现的次数
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
//假设单独出现的两个数分别为x和y
int eor=0;//整个数组的异或和
for(int i=0;i<nums.size();i++){
eor^=nums[i];
}
//此时eor=x^y,找到x和y第一个不相同的位
int m=1;
while((m&eor)==0){
m<<=1;
}
//遍历数组,将数组分成两部分
//nums1[i]&m==0
//nums2[i]&m==1
//x和y必然分开出现在以上两数组中,所以再找数组中一个单独出现的数即可
int x=0;
int y=0;
for(int i=0;i<nums.size();i++){
if((nums[i]&m)==0){
x^=nums[i];
}else{
y^=nums[i];
}
}
return {x,y};
}
};
剑指 Offer 56 - II. 数组中数字出现的次数
class Solution {
public:
int singleNumber(vector<int>& nums) {
//记录数组中所有数各数位1的个数
int arr[32]={};//由于int类型只有32位,所以数组大小为32即可
for(int i=0;i<nums.size();i++){
for(int move=0;move<32;move++){
if(((nums[i]>>move)&1)==1){
arr[move]++;
}
}
}
int single=0;
for(int i=0;i<32;i++){
//由于除了要找的数外其他数都有3个,那每个位上1的个数必然是3n或3n+1
single+=(arr[i]%3)<<i;
}
return single;
}
};