12.只出现一次的数字
一、题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
链接:https://leetcode-cn.com/problems/single-number/solution/zhi-chu-xian-yi-ci-de-shu-zi-by-leetcode-solution/
来源:力扣(LeetCode)
二、示例
示例①
输入: [2,2,1]
输出: 1
示例②
输入: [4,1,2,1,2]
输出: 4
三、代码实现
public static int singleNumber(int[] nums) {
int flag=0;
if (nums.length < 2){
flag = nums[0];
}
for (int i = 0;i < nums.length;i++){
for (int j = 0;j < nums.length;j++){
if (j != i){
if (nums[i] != nums[j]){
flag = nums[i];
}else {
flag = 0;
break;
}
}
}
if (flag != 0){
break;
}
}
return flag;
}
写是写出来了,提交也通过了,我知道我这个不咋地,看到答案还是自闭了
官解:位运算
public static int singleNumberXor(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
补充:
- 交换律: a ^ b ^ c <=> a ^ c ^ b
- 任何数于0异或为原来的数 0 ^ n => n
- 相同的数异或为 0 : n ^ n => 0
int[] a = [2,3,2,4,4]
2 ^ 3 ^ 2 ^ 4 ^ 4 等价于 2 ^ 2 ^ 4 ^ 4 ^ 3 => 0 ^ 0 ^ 3 => 3
我是废物-_-
四、复杂度分析
- 时间复杂度:O(n),其中 n是数组长度。只需要对数组遍历一次。
- 空间复杂度:O(1)。