我有一个包含数字的数组,这是一个例子:
myArray = [0,1,2,4,5];
我需要找到从1开始的最小未使用数字,因此在这种情况下它将是3。
我一直在研究如何使用indexOf
,但我不确定如何将其用于我的特定目的。
我有一个包含数字的数组,这是一个例子:
myArray = [0,1,2,4,5];
我需要找到从1开始的最小未使用数字,因此在这种情况下它将是3。
我一直在研究如何使用indexOf
,但我不确定如何将其用于我的特定目的。
假设数组未排序,您始终从0开始,并考虑到您希望找到最高的数字(如果没有遗漏的数字):
var k = [6, 0, 1, 2, 4, 5];
k.sort(function(a, b) { return a-b; }); // To sort by numeric
var lowest = -1;
for (i = 0; i < k.length; ++i) {
if (k[i] != i) {
lowest = i;
break;
}
}
if (lowest == -1) {
lowest = k[k.length - 1] + 1;
}
console.log("Lowest = " + lowest);
日志回答3。如果3也在其中,将记录7,因为没有其他数字丢失。
如果您不总是从零开始,请使用偏移量:
var k = [6, 2, 3, 4, 5];
k.sort(function(a, b) { return a-b; }); // To sort by numeric
var offset = k[0];
var lowest = -1;
for (i = 0; i < k.length; ++i) {
if (k[i] != offset) {
lowest = offset;
break;
}
++offset;
}
if (lowest == -1) {
lowest = k[k.length - 1] + 1;
}
console.log("Lowest = " + lowest);
由于在序列开始的2之后没有任何缺失,因此日志答案为7。
该函数从一个数字序列(如示例中的1)开始,返回序列中最小未使用的数字。
function lowestUnusedNumber(sequence, startingFrom) {
const arr = sequence.slice(0);
arr.sort((a, b) => a - b);
return arr.reduce((lowest, num, i) => {
const seqIndex = i + startingFrom;
return num !== seqIndex && seqIndex < lowest ? seqIndex : lowest
}, arr.length + startingFrom);
}
例子:
> lowestUnusedNumber([], 1)
1
> lowestUnusedNumber([1,2,4], 1)
3
> lowestUnusedNumber([3], 1)
1
为了提高可读性,它比其他示例稍微不那么优化,因为它会循环遍历数组中的所有项,而不是在找到缺失项后立即停止。