1 题目描述
2 算法思路
思路:
- 题目要求数组出,唯二,只出现一次的数字,其它数字都存在两个
- 可以先分析,如果数组中只存在一个 出现一次的数字,那么全员异或,可以得到该数字。
- 可是本题存在两个,因此需要做一些改变。
- 第一个改变,就是希望找一个方法,可以将两个数字分到两个组中,这样就可以分别求出了
- 进行分组的方法
- 1、先进行全员异或,那么最后的结果相当于,存在的两个数a,b的异或结果,那么只要找到异或结果中为1的位,就可以找到a,b两个数在某一位上的差异,然后根据这一位进行分组,就可以确保a和b分到了两个组中。
3 代码
class Solution {
public int[] singleNumbers(int[] nums) {
int k = 0;
for(int num: nums){ //进行第一次全员异或
k ^= num;
}
//接下来是为了找到两个数字中的差异位,例如k = 001100
int mask = 1;
while((k & mask) == 0){ //那么mask 就是为了得到最后一个1,最后mask = 100
mask <<= 1;
}
int a = 0;
int b = 0;
for(int num:nums){
if((num & mask) == 0){ //根据找到的差异位进行分组
a ^= num;
}else{
b ^= num;
}
}
return new int[]{a,b};
}
}
4 算法流程