LeetCode——268. 丢失的数字(Java)

题目描述

题干:
给定一个包含 [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 中。

题解思路

找到这个数组中从0开始到数组长度中没有元素,长期看官方题解的我第一个念头我就想到了,他第一个方法肯定是排序

数组排序后,至于怎么找到缺失的那个元素就很多方法了,我这里直接用for循环里的i与之比较,当然你也可以通过做差等其他方法

这道题很灵活,其他方法也多,哈希表、数学方法都可以,我这里代码再给出一个位运算的方法,因为效率较高

正确代码

    //排序
    public int missingNumber(int[] nums) {
        Arrays.sort(nums);

        for (int i = 0; i < nums.length; i++) {
            if (i != nums[i]) {
                return i;
            }
        }
        return nums.length;
    }
    
    //位运算
    public int missingNumber1(int[] nums) {
        //这里初值设为数组长度和排序中最后返回数组长度一个道理
        //都是考虑到循环最后一个元素的特殊情况
        int len = nums.length;
        for (int i = 0; i < nums.length; i++) {
            len ^= i ^ nums[i];
        }
        return len;
    }

总结

以后这种能和循环元素挂钩的题目都可以用类似的思路解决,排序虽然是简单的方法,但是调用排序方法复杂度过高

其实找出这种特殊元素的题目哈希表都是不错的选择,所以自己也应该手写熟练一下,其他方法可以自行去官方题解观看

如果文章存在什么问题或者有更好的题解,欢迎评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-03-28 22:26  21岁还不是架构师  阅读(138)  评论(1编辑  收藏  举报