给定一个只包含整数的有序数组 nums
,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。
输入: nums = [1,1,2,3,3,4,4,8,8] 输出: 2
思想同二进制求和plus这篇文章,都是使用的位运算;
class Solution {
public int singleNonDuplicate(int[] nums) {
int res = nums[0];
for(int i = 1;i<nums.length;i++){
res = res^nums[i];
}
return res;
}
}
进阶的问题,如果在一组数中,有一种数出现了奇数次,其余的数出现了偶数次,找出这一种数,解法同上
更加进阶的问题,如果在一组数中,有两种数出现了奇数次,其余的数出现了偶数次,找出这两种数。解题思想:位运算,异或,找到一个二进制数最右侧的一个1
把其中最核心的单独拿出来强调一下:int rightone = res & (~res + 1);//这个操作是最核心的
这个思想是在看左程云leetCode中看到的
完整代码如下:
class Solution {
public int[] singleNonDuplicate(int[] nums) {
int res = nums[0];
int resa = 0;
for(int i = 1;i<nums.length;i++){
res = res^nums[i];
}
//遍历异或结束的时候,res的值为要求的两种数的异或
//如果要求的两种数分别为a,b,此时,res = a ^b;
//求其中一个数最右侧的1
int rightone = res & (~res + 1);//这个操作是最核心的
for(int cur : nums){
if((cur & rightone) !=0){
resa = resa ^cur;
}
}
int resb = resa^res;
int[] arr = {resa,resb};
return arr;
}
}