136. 只出现一次的数字
一、题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
二、题解
1. 异或
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for (int i = 0; i < nums.length; i++) {
result ^= nums[i];
}
return result;
}
}
-
不需要额外的空间是指的算法的空间复杂度为O(1)级别
-
异或运算满足交换律——A ^ B ^ A= A ^ A ^ B
-
任何数异或0都是原数——0 ^ A = A
-
result = 0; result ^ 2 = 2;
-
-
两个相同的数异或为0——A ^ A = 0
-
2 ^ 2 = 0;
-
-
因此一个数字异或同一个数两次还是原数——A ^ B ^ C ^ B ^ C = A ^ B ^ B ^ C ^ C = A
-
result = 1; 1 ^ 2 = 3;// 01 10 3 ^ 2 = 1;// 11 10 1 ^ 3 = 2;// 01 11 2 ^ 3 = 1;// 10 11 结果还是1
-
2. 先排序后比较
class Solution {
public int singleNumber(int[] nums) {
//冒泡排序
int temp = 0;
for (int i = 0; i < nums.length-1; i++){
for (int j = 0; j < nums.length-1; j++) {
if (nums[j]>nums[j+1]) {
temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
//两两比较,不一样就跳出循环输出那个数
temp = nums[0];
for (int i = 0; i < nums.length-2; i+=2) {
if(temp==nums[i+1]){
temp = nums[i+2];
}else {
break;
}
}
return temp;
}
}
- 冒泡排序空间复杂度为O(1)

浙公网安备 33010602011771号