Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1]
Output: 1
Example 2:
Input: [4,1,2,1,2]
Output: 4
该题如果不限制时间复杂度和空间复杂度的话,会有许多的解法
比如:
- 创建一个集合,将第一次出现的数字放入集合,第二次出现的数字从集合中删除
- 将出现的数字和次数存放如哈希表中
但都会出现空间复杂度为O(n)的情况,但题目要求空间复杂度为O(1)
此题采用位运算
我们知道位运算中的异或运算规则
- a ⊕ 0 = a
- a ⊕ a = 0
- a ⊕ b ⊕ a = (a ⊕ a) ⊕ b 满足交换律
此题中,将数组所有的数字进行异或运算,将得到只出现一次的数字(题目说明了只有一个这样的数字)。
class Solution {
public int singleNumber(int[] nums) {
int res = nums[0];
for(int i = 1; i < nums.length; i++){
res = res ^ nums[i];
}
return res;
}
}
总结:要求空间复杂度为O(1),往位运算的方向上思考