只出现一次的数字
给定一个整数数组,除了某个元素外其余元素均出现两次。请找出这个只出现一次的元素。
备注:
你的算法应该是一个线性时间复杂度。 你可以不用额外空间来实现它吗?
解
利用异或的性质解决问题
异或:a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
- a ⊕ a = 0
- a ⊕ b = b ⊕ a
- a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
- d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
- a ⊕ b ⊕ a = b.
- 若x是二进制数0101,y是二进制数1011;
则x⊕y=1110
只有在两个比较的位不同时其结果是1,否则结果为0
即“两个输入相同时为0,不同则为1”!
题干中提到,一个整数数组,除了一个元素只出现一次,其余元素均出现两次。
所以我们可以根据 异或性质 5 来求出结果:
代码实现
public int singleNumber(int[] nums) {
int num = ;
for(int i=;i<nums.length;i++){
num ^= nums[i];
}
return num;
}