使用Javascript查找数组中最小未使用的数字

3

我有一个包含数字的数组,这是一个例子:

myArray = [0,1,2,4,5];

我需要找到从1开始的最小未使用数字,因此在这种情况下它将是3。

我一直在研究如何使用indexOf,但我不确定如何将其用于我的特定目的。


1
你的示例中数组是否保证已排序? - Ed Bayiates
1
在你的数组上进行迭代。找到第一个与索引不匹配的项。 - njzk2
@njzk2 只有在数组始终排序的情况下才有效。 - abc123
2
数组可以以任何数字开头,例如[23,24,26,27],这种情况下应该是25吗? - meteor
不,它是无序的,并且如果取3,则需要取最后一个数字,然后加1。所以在这种情况下,它将是6。 - Andrew Howard
显示剩余2条评论
2个回答

3

假设数组未排序,您始终从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开始检查,并且它将是一个无序列表。如果没有可用的最低数字,我需要做什么?因此,我需要获取数组中的最高数字并加1。所以在我的例子中,它将是6。 - Andrew Howard
不确定你在例子中所说的最高数字是什么意思。你是指如果有[0, 1, 2, 3, 4],你想要5,因为没有缺失的数字吗?我会修改代码来实现这个功能。 - Ed Bayiates
是的,完全正确,好的,请 :) - Andrew Howard
太好了!非常感谢你的帮助 :) - Andrew Howard

2

该函数从一个数字序列(如示例中的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

为了提高可读性,它比其他示例稍微不那么优化,因为它会循环遍历数组中的所有项,而不是在找到缺失项后立即停止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接