每日一练:#0001找出单独出现的数字

描述

给出N个数字。其中仅有一个数字出现过一次,其余数字均出现过两次,找出这个出现且只出现过一次的数字。要求时间和空间复杂度最小。ios

输入

输入多个数字,每一个数字以空格分开。数字数量 N < 20,输入数字的最大值小于 256.spa

输出

输出内容为只出现过惟一一次的数字blog

输入样例

10 10 11 12 12 11 16

输出样例

16

解题思路:由于咱们事先已经知道了只有一个数出现一次其余的全部的数字都是出现两次,出现两次咱们就能够采用^异或运算符来消除(异或两个相同的数会获得0,和全0异或,结果不变;和全1异或,结果会获得本身的取反。)

有公式:a^b^a^b=(a^a)^(b^b),因此咱们能够知道10^10^11^12^12^11^16=16排序

时间复杂度为O(n),空间复杂度为O(1)ci

代码以下:io

#include <iostream>
using namespace std;
int main()
{
	int temp;
	int result = 0;
	while (cin >> temp)
	{
		result ^= temp;
	}
	cout << result << endl;
	return 0;
}

  

此外,若是题目变为只有一个数字出现奇数次,其余的都出现偶数次也能够这样写,”由于两两抵消”。class

另外,还有一些时间复杂度和空间复杂度比较高的解法有如:两个循环遍历(O(n^2)),用map容器等,也能够是先排序后再进行操做,可是时间复杂度和时间复杂度都比用位操做符答。容器

相关文章
相关标签/搜索