Leetcode-只出现一次的数字(c语言)

 

目录

 

只出现一次的数字

测试单元

题目分析

优化版


只出现一次的数字

定给一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。你可以不使用额外空间来实现吗?

示例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;
}

 

猜你喜欢

转载自blog.csdn.net/SoYangA/article/details/81504012