我一直在做一些CodeSignal项目,最近遇到了一个问题,该问题为您提供了一个随机数字数组,并且要求您返回使该数组连续所需的数字数量。
例如,如果给定数组[3,6,8],则需要'4','5'和'7'才能使数组连续。因此输出应为“ 3”。
我找到了一个可行的答案:
return Math.max.apply(Math, arr) - Math.min.apply(Math, arr) -
arr.length + 1;
问题是我不确定为什么会这样。有没有一个数学概念可以解释为什么从最大值中减去数组的最小值和长度会得到正确的答案?
答案 0 :(得分:0)
假定数组只有整数并且对数字进行了排序,那么您可以这样做:
const arr = [1, 4, 6, 9];
let count = 0;
for(let i = arr[0]; i < arr[arr.length-1]; ++i) {
if(!arr.includes(i)) {
count++;
}
}
// 5
console.log(count);
工作示例:http://jsbin.com/xuvikotoju/edit?html,js,console,output
是的,如果您有一个已排序的数组,则可以按照您的操作并按照注释中的说明应用公式:
(max - min) - (array.length + 1)
,您将得到相同的答案。
具有O(1)性能
答案 1 :(得分:0)
您显示的公式假定输入数组中没有重复项。
从最大元素减去最小元素开始。如果没有缺失的数字,则数组的长度等于此差加上1。例如,如果数组包含1
至10
,则差为10-1 = 9
,并且数组的长度为10
。您应该可以轻松地说服自己,这对于任何最小和最大元素都是正确的。
序列中每个缺少的元素都会使数组的长度减少1。因此,如果从没有丢失任何内容的长度中减去数组的实际长度,则会得到缺少的数字。 / p>
因此:
missing = max - min + 1 - length