LeetCode 136. 只出现一次的数字
题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
Java 实现代码
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for (int num : nums) {
result ^= num;
}
return result;
}
}
解题思路
利用异或运算的性质来解决这个问题。异或运算满足以下性质:
- 任何数和0异或等于它本身。
- 任何数和其自身异或等于0。
- 异或运算满足交换律和结合律。
由于数组中除了一个元素出现一次,其他元素均出现两次,我们可以将所有元素进行异或运算。出现两次的元素在异或运算中会相互抵消,最终剩下的就是只出现一次的元素。
复杂度分析
- 时间复杂度:O(n),其中 n 是数组的长度。只需要遍历数组一次。
- 空间复杂度:O(1),不需要额外的空间。
举例说明执行过程
假设数组为
[4,1,2,1,2]
。
- 初始化
result = 0
。- 遍历数组,执行异或运算:
result = 0 ^ 4 = 4
result = 4 ^ 1 = 5
result = 5 ^ 2 = 7
result = 7 ^ 1 = 6
result = 6 ^ 2 = 4
- 最终
result = 4
,这是只出现一次的元素。因此,数组
[4,1,2,1,2]
中只出现一次的元素是4
。