GeekIBLi

LeetCode-只出现一次的数字

2021-08-19

只出现一次的数字

https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x21ib6/

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1
示例 2:

输入: [4,1,2,1,2]
输出: 4
相关标签
位运算

分析

仅仅出现一个,很显然,这个数和前后都不一样,然后特殊判断一下头部和尾部就可以了。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public int singleNumber(int[] nums) {
if(nums == null || nums.length == 0){
return 0;
}
if(nums.length == 1){
return nums[0];
}
Arrays.sort(nums);
for(int i = 2; i < nums.length; i++){
if(nums[i - 2] != nums[i - 1] && nums[i - 1] != nums[i]){
return nums[i - 1];
}
if(i == nums.length - 1 && nums[i] != nums[i - 1]){
return nums[i];
}
if(i == 2 && nums[i - 2] != nums[i - 1]){
return nums[i - 2];
}
}
return 0;
}
}

分析二

使用异或运算,将所有值进行异或
异或运算,相异为真,相同为假,所以 a^a = 0 ;0^a = a
因为异或运算 满足交换律 a^b^a = a^a^b = b 所以数组经过异或运算,单独的值就剩下了

https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x21ib6/?discussion=Mo9fKT

代码二

1
2
3
4
5
6
7
8
9
class Solution {
public int singleNumber(int[] nums) {
int reduce = 0;
for (int num : nums) {
reduce = reduce ^ num;
}
return reduce;
}
}