「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」
问题描述
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。(出自力扣)
示例
输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。
输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。
输入:nums = [0]
输出:1
解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。
解题思路
方法一:
- 根据题意可知,本来[0,n]的长度应该是 n+1 的,但是由于这个数组缺少了一个元素,这个数组剩下的长度就是 n 了。
- 我们可以根据求和公式 n*(n+1)/2 算出没有丢失元素时数组的元素总和total。再循环计算出缺失元素的数组总和subTotal;这样的话就可以计算这个元素了:total - subTotal。
方法二:
- 通过示例中我们能知道,缺失一个元素的数组nums,如果它不会缺失这个元素的话,里面的元素呈递增状态的;假设我们把它进行排序一下,可得到这样的一个数组:后一位数比前一位数大 1 ,并且,这个数组还是从 0 开始的;这不就跟数组的下标一样的嘛,这样看来,这个数组每个元素和它对应的下标是相等,若是出现不相等的时候呢,那这个下标就是缺失的那个元素了
实现过程
方法一:
function getNum(nums) {
let len = nums.length;
// 没有缺失元素的数组总和
let total = len*(len+1)/2;
let subTotal = 0;
// 缺失元素的数组总和
nums.forEach( item => {
subTotal+=item;
})
// 两总和之差就是那个缺失的元素
return total - subTotal;
}
console.log(getNum([0]))
方法二:
function getNum(nums) {
let max = null;
for(let i=0; i<nums.length-1; i++) {
for(let j=0; j<=nums.length-1; j++) {
if(nums[j] > nums[j+1]) {
max = nums[j];
nums[j] = nums[j+1];
nums[j+1] = max;
}
}
}
console.log(nums)
for(let i=0; i<nums.length; i++) {
if(nums[i] != i) {
return i;
}
}
return nums.length;
}
console.log(getNum([3,0,1,4]))