260. Single Number III
Given an array of numbers nums
, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5]
, return [3, 5]
.
Note:
- The order of the result is not important. So in the above example,
[5, 3]
is also correct. - Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
1. 利用异或 a^b=b^a,a^a=0,0^a=a;
2. 循环数组,异或结果的最低位为1的flag将数组中数字分为两类,一类是与flag按位与为0,另一类为1,这样再异或一次就能找出这两个数;
注意:
1. ==的优先级比&的优先级高,所以&时需要加括号
public class Solution {
public int[] singleNumber(int[] nums) {
int flag=0;
for(int i=0;i<nums.length;i++){
flag^=nums[i];
}
int temp=1;
int result[]=new int[2];
while((temp&flag)==0) temp=temp<<1;//这里不能写为(temp&flag!=1 会时间超过,不知道为什么
for(int i=0;i<nums.length;i++){
if((nums[i]&temp)==0) result[0]^=nums[i];
else
result[1]^=nums[i];
}
return result;
}
}