标题 | 136. 只出现一次的数字 |
难度 | 简单 |
天数 | 第1天,第1/3题 |
数据结构 | 数组 |
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
以上内容来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
-
方法一
- 使用位运算XOR来处理
- 相同数
3^3(异或) = 0
; - 任何数
^异或0
都等于它本身0^3 = 3
a ^ b ^ a = (a^a) ^b
- 时间 : O(n) 空间O(1)
-
[4,1,2,1,2] 举例
- 第一次算 4^ 1 = 0101 = 5
- 第二次算 5 ^ 2 = 7
- 第三次算 7 ^ 1 = 6
- 第四次算 6 ^ 2 = 4
class Solution {
//数据结构基础 第 1 天 数组 1/3
public int singleNumber(int[] nums) {
//方法一 XOR运算(异或)
for(int i = 1; i < nums.length;i++){
nums[0] ^= nums[i];
}
return nums[0];
}
- 方法二
- 先排序,再对比
- 针对第一个和最后一个特殊处理
- 空间: O(1) 时间 : n*O(n)
- 只有一个的元素特殊处理
if(nums.length == 1){
return nums[0];
}
- 使用系统方法排序
Arrays.sort(nums);
- 循环从第二个开始,倒数第二个结束
for(int i = 1;i < nums.length - 1;i++){}
- 第一个是出现一次的数
if(i == 1 && nums[i] != nums[i-1]){
//第一个是出现一次的数
return nums[i-1];
}
- 最后一个是出现一次的数
if(i == nums.length - 2 && nums[i] != nums[i+1]){
//最后一个是出现一次的数
return nums[i+1];
}
- 中间是出现一次的数
if(nums[i] != nums[i-1] && nums[i] != nums[i+1]){
return nums[i];
}
完整代码:
class Solution {
//数据结构基础 第 1 天 数组 1/3
public int singleNumber(int[] nums) {
//方法二 ,先排序再对比
if(nums.length == 1){
return nums[0];
}
Arrays.sort(nums);
for(int i = 1;i < nums.length - 1;i++){
if(i == 1 && nums[i] != nums[i-1]){
//第一个是出现一次的数
return nums[i-1];
}else if(i == nums.length - 2 && nums[i] != nums[i+1]){
//最后一个是出现一次的数
return nums[i+1];
}else if(nums[i] != nums[i-1] && nums[i] != nums[i+1]){
return nums[i];
}
}
//没有符合规则的
return -1;
}
}