3

假设,我有一个vec<int>包含可能不连续的整数列表(由于从数据库中删除了元素)。

例子:

$occupiedNumbers = vec[1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 15, 16];

现在我需要检查它是否vec包含给定的数字,如果是,则将其增加 1 并重复检查。

$newItemNumber = count($occupiedNumbers);
while (/* check if $occupiedNumbers contains $newItemNumber */) {
    $a++;
}

在 vanilla PHP 中,有in_array()这个功能,但这适用于 avec吗?此外,还有一个内置函数,HH\Vector::linearSearch()但它旨在与vec' 的前身HH\Vector.

检查 a 是否包含给定值的正确解决方案是什么?vec

HHVM 和 Hack 文档都没有提到vec. 此外,我缺少某种 REPL 工具来在项目外手动检查它,而无需构建整个(可能有故障的)项目。

4

2 回答 2

3

HHVM /HackLang人的建议是使用C\contains()您可以在此处阅读的内容,但您需要使用. 该库包含处理新数组类型结构的大量函数:, , . HSL 库中的这些函数以, ,为前缀,您还会发现,等对其他需求非常有用。hhvm/hslcomposervecdictkeysetCVecDictKeysetMathStr

安装该软件包后,它变得可用,但通常添加use namespace以避免长前缀更方便:

use namespace HH\Lib\C;

您可以这样做:

$exists = C\contains($occupiedNumbers, $newItemNumber);

于 2020-12-05T04:44:14.153 回答
1

如果您真的在寻找最长的连续间隔,count($occupiedNumbers)那么在排序列表中找到它的初始索引(如果存在)可能会快得多,然后从那里使用直接索引:

// `use namespace HH\Lib\{C, Vec};` at top level
$occupiedNumbers = vec[1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 15, 16];

$sorted = Vec\sort($occupiedNumbers); // if not sorted in general
$size = count($sorted);
$v = $size;
$i = C\find_key($sorted, $w ==> $w === $v);
if($i !== null) {
  for(; $i < $size - 1 && $sorted[$i + 1] === $v + 1; $i++, $v++) {
  }
}
// $i is null | <index of largest number in continuous interval>
于 2020-12-05T22:17:07.247 回答