hot100里的简单题
我们先来复习一遍与或非:
- 与(AND) :符号
&&或&,两个操作数都为真时结果为真 - 或(OR) :符号
||或|,至少一个操作数为真时结果为真 - 非(NOT) :符号
!,真变假,假变真 - 异或(XOR) :符号
^,两个操作数不同时为真,相同时为假
异或运算有几个重要性质:
- 任何数与 0 异或等于它本身:
a ^ 0 = a - 任何数与自身异或等于 0:
a ^ a = 0 - 异或运算满足交换律和结合律:
a ^ b = b ^ a,(a ^ b) ^ c = a ^ (b ^ c)
参考代码:
java
class Solution {
public int singleNumber(int[] nums) {
int n = nums.length;
int ret = 0;
for(int i = 0; i <= n - 1; i++){
ret = ret ^ nums[i];
}
return ret;
}
}
这段代码利用了异或运算的性质来找出数组中只出现一次的数字:
- 初始化
ret = 0 - 遍历数组,对每个元素执行异或操作
- 由于异或运算满足交换律和结合律,所有出现两次的数字都会相互抵消为 0
- 最终剩下的就是只出现一次的数字
例如数组 [4, 1, 2, 1, 2]:
0 ^ 4 = 44 ^ 1 = 55 ^ 2 = 77 ^ 1 = 66 ^ 2 = 4← 最终结果
时间复杂度 O(n),空间复杂度 O(1)。