【20190404】【每天一道算法题】只出现一次的数字(位运算)

版权声明:=================== 转载请注明出处======================= 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!!!要尤其注意!

猜你喜欢

转载自blog.csdn.net/weixin_40583722/article/details/89227769