算法题解-丢失的数字

195 阅读2分钟

题目

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

输入: nums = [3,0,1]
输出: 2

题解

第一种

我们在函数中首先对数组进行了排序,方便后面我们进行查找缺失的数字,然后我们进行判断数组中的第一个数是不是0,如果不是那么缺失的数就是0,接下来判断数组中的最后一个数是否不等于数组的长度,如果是那么缺失的数就是数组的长度,如果上述的条件都不满足,那么我们就通过遍历数组进行查找缺失的数,在遍历过程中如果我们发现了一个数字和它的下标不相等,那么就说明这个数字就是缺失的数,我们直接返回即可,在找到后我们通过break来终止循环,因为找到缺失的数字后,后面的数字我们都不需要进行查找了,直接跳出即可

var missingNumber = function(nums) {
   nums.sort((a,b)=> {return a-b})
    if(nums[0]!==0) {
     return 0
    } else {
      if(nums[nums.length-1]!==nums.length){
        return nums.length
      } else {
        for(let i=0;i<nums.length;i++){
          if(i!==nums[i]) {
              return i
              break
          }
       }
      }
    }
};

第二种

我们这里还有另一种实现方式,我们通过遍历数组并交换元素的位置,使得每个元素都在其对应的索引位置上,然后找出未被交换到正确位置的元素的索引即可,接下来我们来实现一下,我们先在数组末尾添加一个undefined元素,方便我们在遍历时处理最后一个元素然后我们使用while循环遍历整个数组,在循环中尝试将当前元素交换到其正确的位置上,如果当前元素是undefined,则说明该元素是缺失的数字,我们就将其索引记录为目标索引target,并继续遍历。如果当前元素已经在正确的位置上,则继续遍历,否则将其与其正确的位置上的元素交换位置,当循环结束后,我们将target返回出去即可

var missingNumber = function(nums) {
    let target = -1,
        init = 0
    nums.push(undefined)
    while (init < nums.length) {
      const change = nums[init]
      nums[init] = nums[change]
      nums[change] = change
      if (!nums[init]) {
        target = init
        init ++
      }
      nums[init] !== init ? init : init ++
    }
    return target
};

坚持努力,无惧未来!