题目简述:
给定一个非排序好的数组,存在一个数字x只出现了一次,其他数字都出现了两次
要求不使用额外空间,找出这个x
评论里有一句经验非常有价值:
不需要额外空间的方法,就往位运算上想
一般来说有线性复杂度,那么算法复杂度就是O(n),那么也就是说一层循环就能直接找到结果,不存在嵌套
练习
我要挑战:https://leetcode-cn.com/problems/single-number/
分析
要找出数组中唯一一个只出现一次的元素,你可以使用「异或」运算。异或运算有几个重要的性质:
- 任何数和0做异或运算,结果仍然是原来的数,即
a ^ 0 = a
。 - 任何数和其自身做异或运算,结果是0,即
a ^ a = 0
。 - 异或运算满足交换律和结合律,即
a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
。
因此,你可以初始化一个变量来进行累积异或操作,由于除了一个元素之外,其余元素都是成对出现的,所以这些成对的元素异或后会变成0,最终剩下的就是那个只出现一次的元素。以下是一个简单的Java代码实现: