//首先,空间复杂度1,说明不能使用map存储了。
题意得知很多重复的元素,要寻找单个元素。可以使用异或运算。即使不在一起,两个相同的数进行异或运算也可以消掉。
//使用异或运算。然后把数组分为两份
//(异或得到的结果找到哪一位不为0,说明这一位两个数不一样。
//根据这一位把数组分为两份,两个只出现一次的数肯定分别位于两个数组中),
//这两个数字分别在两个数组中,分别对数组进行运算可以得到该数。
class Solution {
public int[] singleNumbers(int[] nums) {
//首先,空间复杂度1,说明不能使用map存储了。
//看了题解使用异或运算。然后把数组分为两份
//(异或得到的结果找到哪一位不为0,说明这一位两个数不一样。
//根据这一位把数组分为两份,两个只出现一次的数肯定分别位于两个数组中),
//这两个数字分别在两个数组中,分别对数组进行运算可以得到该数。
if(nums==null ||nums.length==0){
return null;
}
int sum=0;
for(int temp:nums){
sum = temp ^ sum;
}
int m=1;
while((m&sum)==0){
m= m<<1;
}
//此时m与sum同时拥有某位等于1.
//而根据这一位可以把数组分为两份,两个只出现一次的数肯定分别位于两个数组中
int zeroArr=0;
int oneArr=0;
for(int temp:nums){
if((temp&m)==0){
zeroArr=zeroArr^temp;
}else{
oneArr=oneArr^temp;
}
}
int[] arr= new int[2];
arr[0]=zeroArr;
arr[1]=oneArr;
return arr;
}
}