解题思路:将原数组遍历一遍将key和出现的次数放到map里,然后对map进行过滤,最后转成集合再转成数组返回。时间复杂度O(N),空间复杂度O(N)。
import java.util.*;
import java.util.stream.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] FindNumsAppearOnce (int[] array) {
// write code here
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < array.length; i++) {
if (map.containsKey(array[i])) {
map.put(array[i], map.get(array[i]) + 1);
} else {
map.put(array[i], 1);
}
}
List<Integer> list = map.entrySet().stream().filter(o->o.getValue() == 1).map(
o -> o.getKey()).sorted().collect(Collectors.toList());
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
解法二:异或求值,时间复杂度O(N),空间复杂度O(N)。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] FindNumsAppearOnce (int[] array) {
// write code here
int res = 0;
for (int i = 0; i < array.length; i++) {
//res就是两个不一样的值异或的结果
res ^= array[i];
}
//下面想办法把这两个值分到两个数组里然后在两个数组里分别异或就能得到这两个值
int tmp = 1;
while ( (tmp & res) == 0 ) {
//找到两个数第一个不为0的位
tmp <<= 1;
}
int a = 0, b = 0;
for (int i = 0; i < array.length; i++) {
if ((array[i] & tmp) == 0) {
//与tmp相与=0的一组
a ^= array[i];
} else {
//与tmp相与!=0的一组
b ^= array[i];
}
}
return a < b ? new int[] {a, b}: new int[] {b, a};
}
}