问题描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
(来源:leetcode)
解法一:异或算法
a^a=0;自己和自己异或等于0
a^0=a;任何数字和0异或还等于他自己
a^b^c=a^c^b;异或运算具有交换律
int singleNumber(int* nums, int numsSize){
if(numsSize < 2) return nums[0];
int odd = 0, i;
for(i = 0; i < numsSize; i++){
odd ^= nums[i];
}
return odd;
}
解法二:排序加双指针
int singleNumber(int* nums, int numsSize){
if(numsSize < 2) return nums[0];
int temp, i;
for(i = 1; i < numsSize; i++){
temp = nums[i];
int low = 0, high = i - 1, j;
while(low <= high){
int mid = (low + high)/2;
if(nums[i] < nums[mid]) high = mid - 1;
else low = mid + 1;
}
for(j = i - 1; j >= high +1; j--) nums[j+1] = nums[j];
nums[high + 1] = temp;
} // 折半排序
int p = 0, q = 1;
while(q < numsSize){
while(q < numsSize && nums[p] == nums[q]) q++;
if(q - p < 2) return nums[p];
p = q;
q++;
} //双指针,p指示要查找的元素,q用来查找对应元素个数
return nums[p]; //既然必有一个为单的数字,如果前面没有return,那么最后这一个一定是。
}