题目
题解一:map计数
采用map集合计数,提前将区间的数加入map,再将数组中的数与map集合key比较,若相同,则value+1,,最后找出value为0的数就是未出现的数
/**
* hash
* @param nums
* @return
*/
public static List<Integer> findDisappearedNumbers(int[] nums) {
Map<Integer ,Integer> map = new HashMap<>();
//把[1-n]提前存入map
int s = 1;
while (s<=nums.length){
map.put(s,0);
s++;
}
//循环数组 若key重复 则value+1
for (int i = 0; i < nums.length; i++) {
// 若key重复 则value+1
if (map.containsKey(nums[i])) {
map.put(nums[i],(map.get(nums[i])+1));
}
}
//找出value值为0 的key放入list数组
ArrayList<Integer> list = new ArrayList<>();
for (Map.Entry<Integer,Integer> entry: map.entrySet()){
if (entry.getValue() == 0) {
list.add(entry.getKey());
}
}
return list;
}
题解二:set去重
set去重 采用add方法重复的元素添加会返回false
/**
* hashSet
* @param nums
* @return
*/
public static List<Integer> findDisappearedNumbers(int[] nums) {
Set<Integer> set = new HashSet<>();
ArrayList<Integer> list = new ArrayList<>();
//将数组提前加入set集合 同时去重
for (int i= 0;i<nums.length;i++){
set.add(nums[i]);
}
//去重,重复的返回false
int s = 1;
while (s<=nums.length){
if (set.add(s)) {
list.add(s);
}
s++;
}
return list;
}
题解三:负数标记法
将所有正数作为数组下标,置对应数组值为负值。那么,仍为正数的位置即为(未出现过)消失的数字。
/**
* 负数标记法
* @param nums
* @return
*/
public static List<Integer> findDisappearedNumbers(int[] nums) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
//取绝对值
int abs = Math.abs(nums[i]);
//该位置》0才修改为负数 本来就位负数 就不修改了
if (nums[abs-1]>0) {
nums[abs-1] = -nums[abs-1];
}
}
//找出不是负数的位置的数的索引 +1
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
list.add(i+1);
}
}
return list;
}