版权声明:=================== 转载请注明出处======================= https://blog.csdn.net/weixin_40583722/article/details/89227769
问题:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
思路与解答:
/* 想法:第一步:排序(要求时间复杂度是线性,那么用快排)
* 第二步:检查i=0:numsSize-2的元素,看它是否与左右两边的元素存在相同的情况,如果没有则返回nums{i],
* 否则返回nums[numsSize-1],这是因为最后一个元素没有参与for循环的检查,其他都满足情况的话,
* 那么就只有最后一个不满足。
*/
//int cmp (const void *a, const void *b)
//{
// return *(int *)a - *(int *)b;
//}
//int singleNumber(int* nums, int numsSize)
//{
// qsort(nums, numsSize, sizeof(nums[0]), cmp);
// if(numsSize == 1) //要注意考虑边界情况!
// return nums[0];
// if(nums[0] != nums[1])
// return nums[0];
// for(int i = 1; i < numsSize-1; i++) //i从1开始,所以造成第一个元素nums[0]没有检查,所以上面if判断一下(也可以for循环从i=0开始,那么改一下nums索引即可)
// if(nums[i-1] != nums[i] && nums[i] != nums[i+1])
// return nums[i];
// return nums[numsSize-1];
//}
/*使用位运算:异或*/
int singleNumber(int* nums, int numsSize)
{
int tmp = 0;
for(int i =0; i < numsSize; i++)
{
tmp = tmp ^ nums[i];
}
return tmp;
}
知识点:
之前说的异或:“相同为0,不同为1”是针对二进制数来说的,所以4^1(4异或1)并不是1!!!要尤其注意!