题目
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
限制:
2 <= nums <= 10000
异或
由于题目中要求空间复杂度为O(1),那么就不能考虑使用哈希表之类的来存储数组中的元素了,这时有一个奇妙的方法,就是利用异或的性质(不同返回1,相同返回0)。
首先我们考虑一下如果只有一个数字出现了一次应该如何求解
如果题目中的数组只有一个数字出现了一次的话,我们考虑一下将整个数组异或是什么结果,因为相同的数字按位异或的话,各个位都会变为零,那么最终肯定会出现零和只出现一次的数字进行异或,和零异或的结果还是原来的数字。所以我们只要将整个数组进行异或就可以求得只出现一次的数字了。