问题
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
例子
思路
-
方法1 O(n) O(n)
map
-
方法2 O(n) O(1)
异或
代码
//方法1
class Solution {
public int[] singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
int[] res = new int[2];
for(int n:nums)
{
map.put(n, map.getOrDefault(n,0)+1);
}
int i=0;
for(int k:map.keySet())
if(map.get(k)==1) res[i++]=k;
return res;
}
}
//方法2
class Solution {
public int[] singleNumber(int[] nums) {
int[] res = new int[2];
int ans = 0;
for(int n: nums)
ans ^= n;
//1 结果ans里至少有一个位的值为1,意味着这个位上,要么a是1,b是0,要么b是1,a是0
//i是ans二进制中为1的位置所表示的数
int i=1;
while((ans&i)!=i)
i<<=1;
//根据这个1对应的位置是否为1,可以把数组一分为二,为1的做一次异或运算,为0的做一次异或运算,即可求出两数
for(int n:nums){
if((n&i)==i) {
res[1]^=n;
}else{
res[0]^=n;
}
}
return res;
}
}