最近疫情在家里刷水题。这一题是找出数组中只出现一次的数字
要求时间复杂度 O(n),并且不开辟新空间存放。
题目:只出现一次的数字
之前在剑指Offer上做过一次,是用排序,然后数字谁是只有1个的就一目了然。
但是时间复杂度就是 O(logN+N)了。
这次的思路是使用异或运算,异或运算的重要概念如下(其中N为任意数):
- 0 xor N = N
- N xor N = 0
- 异或运算满足交换律和结合律
即: a xor b xor a = (a xor a) xor b = 0 xor b = b
所以看到这里,瞬间茅塞顿开,惭愧的记录一下…
class Solution {
public int singleNumber(int[] nums) {
int xor = 0;
for(int i: nums){
xor ^= i;
}
return xor;
}
}