题目要求时间复杂度为O(n),且不分配额外空间。
利用for循环,逐一对数组元素进行异或运算。
以下是关于异或的知识点:
1. 如果a等于b 则 a^b = 0;
2 如果a不等于b 则a^b = 1
对于任意整数n,n^0 = n ,而n^n = 0
异或运算是满足交换结合律的
假设数组中一共有2n+1个数,n个数出现了两次,一个数出现了一次。
将所有2n+1个数进行异或运算,由于满足交换律,可以假想成重复的两个元素都挨在一起,single number排在最后。
这与乱序数组的异或运算结果是相同的,得到最后一个结果就是singlenumber。
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for(int i = 0;i<nums.length;i++){
result = result ^ nums[i];
}
return result;
}
}