目录
只出现一次的数字
定给一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。你可以不使用额外空间来实现吗?
示例1:
输入: [2,2,1] 输出: 1
示例2:
输入: [4,1,2,1,2] 输出: 4
测试单元
(养成先写测试用例的习惯)满足题目测试用力中只有一个只出现一次的数字(如题目给出的示例)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nums1[3] = { 2, 2, 1 };
int nums2[5] = { 4, 1, 2, 1, 2 };
int result1 = singleNumber(nums1, 3);
int result2 = singleNumber(nums2, 5);
printf("%d,%d", result1, result2);
system("pause");
return 0;
}
题目分析
要找到一组数据中只出现一次即没有重复的数字(且其他数字只出现两次),其他数字只出现两次这个是解题的关键,我们可以暴遍历法,记录下每个数据出现的次数然后再找到其中只出现一次的数字(这样做太麻烦了,而且效率不高),我们学过一个运算符(^)它的作用是两个数的二进制中的每一个比特位,形同为0,不同则为1.即(1 ^ 1 = 0,50 ^ 50 = 0,0 ^ 100 = 100),那如果将这组数据每一位都^则最后的出的那个结果就是只出现一次的那个数。
代码如下:
优化版
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int singleNumber(int* nums, int numsSize)
{
int result = nums[0];
for (int i = 1; i < numsSize; i++)
{
result ^= nums[i];
}
return result;
}
int main()
{
int nums1[3] = { 2, 2, 1 };
int nums2[5] = { 4, 1, 2, 1, 2 };
int result1 = singleNumber(nums1, 3);
int result2 = singleNumber(nums2, 5);
printf("%d,%d", result1, result2);
system("pause");
return 0;
}