每日一练:#0001找出单独出现的数字
描述
给出N个数字。其中仅有一个数字出现过一次,其他数字均出现过两次,找出这个出现且只出现过一次的数字。要求时间和空间复杂度最小。
输入
输入多个数字,每个数字以空格分开。数字数量 N < 20,输入数字的最大值小于 256.
输出
输出内容为只出现过唯一一次的数字
输入样例
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)
代码如下:
#include <iostream> using namespace std; int main() { int temp; int result = 0; while (cin >> temp) { result ^= temp; } cout << result << endl; return 0; }
此外,如果题目变为只有一个数字出现奇数次,其他的都出现偶数次也可以这样写,”因为两两抵消”。
另外,还有一些时间复杂度和空间复杂度比较高的解法有如:两个循环遍历(O(n^2)),用map容器等,也可以是先排序后再进行操作,但是时间复杂度和时间复杂度都比用位操作符答。