题目
给定一个包含
[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
};
坚持努力,无惧未来!