本文最后更新于 354 天前,其中的信息可能已经有所发展或是发生改变。
题目描述:
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
提示:
1 <= nums.length <= 3 * 10^4
-3 * 10^4 <= nums[i] <= 3 * 10^4
- 除了某个元素只出现一次以外,其余每个元素均出现两次。
解法一:位运算
算法思路:
首先了解异或运算的性质:
- 任何数和自己做异或运算,结果是 0,即
x ⊕ x = 0
。 - 任何数和 0 做异或运算,结果任然是原来的数,即
x ⊕ 0 = x
。
所以我们对该数组所有元素进行异或运算,结果就是只出现一次的数字。
代码实现:
class Solution {
public int singleNumber(int[] nums) {
int ans = 0;
for(int num : nums){
ans ^= num;
}
return ans;
}
}
复杂度分析:
时间复杂度: O(n),其中 n 为数组 nums 的长度。
空间复杂度: O(1)。