1.只出现一次的数字
给定一个整数数组,除了某个元素外其余元素均出现两次。请找出这个只出现一次的元素。
分析:
1.利用异或位运算的特性
int singleNumber(vector<int>& nums) {
int count=0;
for(int i=0;i<nums.size();i++){
count^=nums[i];
}
return count;
}
2.只出现一次的数字 II
给定一个整型数组,除了一个元素只出现一次外,其余每个元素都出现了三次。求出那个只出现一次的数。
分析:
1.只有一个元素出现一次,其他元素出现三次
2.出现三次的元素每位上的1的和为3的倍数
int singleNumber(vector<int>& nums) {
int result=0;
for(int i=0;i<8*sizeof(int);i++) {
int count=0;
for(int j=0;j<nums.size();j++) {
count+=(nums[j]>>i)&1;
}
result+=(count%3)<<i;
}
return result;
}
3.只出现一次的数字 III
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其他所有元素均出现两次。 找出只出现一次的那两个元素
给定 nums = [1, 2, 1, 3, 2, 5]
返回 [3, 5].
分析:
1.两次出现的数在异或中抵消,留下两个不同出现一次的数
2.找到这两个数结果位上的第一个1的index
3.以index区分这两个数,并重新将数组分为两个子数组,这两个数分别在这两个数组中
vector<int> singleNumber(vector<int>& nums) {
vector<int> result(2);
int sum=0,j,low=0,high=nums.size()-1;
for(int i=0;i<nums.size();i++)
sum^=nums[i];
for(j=0;j<8*sizeof(int);j++)
if((sum>>j)&1)break;
while(low<high){
while(!((nums[low]>>j)&1))low++;
while((nums[high]>>j)&1)high--;
if(low<high){
int tmp=nums[low];
nums[low]=nums[high];
nums[high]=tmp;
}
}
for(int i=0;i<nums.size();i++){
if(i<low){
result[0]^=nums[i];
}else{
result[1]^=nums[i];
}
}
return result;
}