【LeetCode-简单题】448. 找到所有数组中消失的数字

题目

在这里插入图片描述

题解一: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;

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值