世界大雨滂沱,万物苟且而活
—— 24.4.1
只出现一次的数字
给你一个 非空 整数数组
nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1] 输出:1示例 2 :
输入:nums = [4,1,2,1,2] 输出:4示例 3 :
输入:nums = [1] 输出:1提示:
1 <= nums.length <= 3 * 104
-3 * 104 <= nums[i] <= 3 * 104
- 除了某个元素只出现一次以外,其余每个元素均出现两次。
思路及算法
标签:位运算
本题根据题意,线性时间复杂度 O(n)O(n)O(n),很容易想到使用 Hash 映射来进行计算,遍历一次后结束得到结果,但是在空间复杂度上会达到 O(n)O(n)O(n),需要使用较多的额外空间
既满足时间复杂度又满足空间复杂度,就要提到位运算中的异或运算 XOR,主要因为异或运算有以下几个特点:
一个数和 0 做 XOR 运算等于本身:a⊕0 = a
一个数和其本身做 XOR 运算等于 0:a⊕a = 0
XOR 运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
故而在以上的基础条件上,将所有数字按照顺序做抑或运算,最后剩下的结果即为唯一的数字
class Solution {
public int singleNumber(int[] nums) {
int x = 0;
for (int i = 0; i < nums.length; i++){
// 1. 遍历 nums 执行异或运算
x ^= nums[i];
}
return x; // 2. 返回出现一次的数字 x
}
}
时间复杂度
标签:XOR,运算,nums,int,复杂度,示例,力扣,一题,21 From: https://blog.csdn.net/m0_73983707/article/details/137239834时间复杂度:O(n)
空间复杂度:O(1)