刷题日记06-丢失的数据(排序)

丢失的数字

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

示例 1:

输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 2:

输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 3:

输入:nums = [9,6,4,2,3,5,7,0,1]
输出:8
解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

示例 4:

输入:nums = [0]
输出:1
解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。

此题我共有三种解法,一种是我自己想出来的,还有两种是我看了题解。

方法一:先遍历0-n的每一个元素,拿得到的元素去输入数组中查询,利用Arrays.binarySearch()这个方法判断查询元素是否存在于数组中,如果不存在就把这个元素返回。要注意的是Arrays.binarySearch()这个方法在使用之前,要先把数组排序。代码如下:

class Solution {
    public int missingNumber(int[] nums) {
        int result = 0;
        Arrays.sort(nums);
        int n = nums.length;
        for (int i = 0; i <= n; i++) {
            int binarySearch = Arrays.binarySearch(nums, i);
            if(binarySearch < 0){
                result = i;
            }
        }

        return result;
    }
}

方法二:把[0-n]当做一个数组,比如n = 3,数组为{0,1,2,3}。对输入的数组先进性排序,得到{0,1,3}。对输入数组{0,1,3}进行遍历,把遍历到的元素和[0-n]这个数组对应位置的元素进行比较,如果不相等就说明[0-n]对应位置的元素就是确实的元素。特殊情况就是确实的元素是尾元素,比如输入:nums = [0],输出:1。在遍历的时候遍历不出来的,会完成遍历。也就是说如果完成了数组的遍历,就说明缺失的元素在尾部,尾部元素就等于缺失数组的长度n,将n在循环后返回即可。代码如下:

public static int missingNumber(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);
        for (int i = 0; i < n; i++) {
            if (nums[i] != i){
                return i;
            }
        }

        return n;
    }

方法三:采用HashSet集合,将输入数组存入到Set集合中。遍历[0-n],判断元素是否在集合中。代码如下:

class Solution {
    public static int missingNumber(int[] nums) {
        int n = nums.length;

        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            set.add(nums[i]);
        }

        int missing = -1;

        for (int i = 0; i <= n; i++) {
            if (!set.contains(i)){
                missing = i;
            }
        }

        return missing;
    }
}

#如何看待2023届秋招##你的秋招进展怎么样了##我的求职思考##0offer是寒冬太冷还是我太菜#
全部评论
看了你好几天的刷题记录了,只能说不知道你在哪刷的题。建议去力扣刷去。你这些题解根本就过不了面试。像这题面试官会直接给你定O(n)和常数复杂度。排序哈希这种解法根本没意义。前面好几天都是,纯暴力解法没任何意义
点赞 回复 分享
发布于 2023-01-16 22:33 山东
n(n+1)/2-sum(nums)
点赞 回复 分享
发布于 2023-01-16 23:41 北京
去leetcode吧
点赞 回复 分享
发布于 2023-01-16 23:49 陕西

相关推荐

2024-12-02 22:30
西安理工大学 Java
M_bao:简历排版换一下吧,第二个项目换了吧,咱门双非学历本来就不行还用这种项目太掉分了,300沟通一个要简历你打招呼也有问题。
点赞 评论 收藏
分享
评论
33
2
分享
牛客网
牛客企业服务