题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
要求时间复杂度是O(n),空间复杂度是O(1)。
思路
空间复杂度要求不能用map了(O(n)),暴力更不想了(O(n^2))。
一、正解:分组异或。链接如下。
大佬分组异或做的
二、不管要求,就只会map。练练也行。
小细节:
1、hashmap.getOrDefault(x,y)
x,y类型自定,意思x存在keySet()里就获得对应value,x不存在就默认给个y。
2、int[] 和 int 动态创建时(int[] a = new int[n]),默认为所有元素都为0。而不是字符串的null。简单但最开始忽视了。
代码
HashMap版 非正解
class Solution {
public static int[] singleNumbers(int[] nums) {
int[] res = new int[2];
HashMap<Integer, Integer> hashmap = new HashMap<>();
for(int i =0; i<nums.length; i++){
hashmap.put(nums[i], hashmap.getOrDefault(nums[i],0)+1);
}
for(Map.Entry<Integer, Integer> map : hashmap.entrySet()){
if(map.getValue() == 1){
if(res[0] == 0) {
res[0] = map.getKey();
}
else if(res[1] == 0) {
res[1] = map.getKey();
}
}
}
return res;
}
}