【问题标题】:Get closest (but higher) number in an array获取数组中最接近(但更高)的数字
【发布时间】:2019-06-30 10:49:26
【问题描述】:

我有一个数字,比如 165

我有一个包含数字的数组。像这样:

[2、42、82、122、162、202、242、282、322、362]

我希望将我得到的数字更改为最接近但更大的数组数字。

例如我得到 165 它应该是 202

javascript 数组

【问题讨论】:

  • 代码在哪里?
  • 到目前为止您尝试了什么?只是一个常规循环并检查 nr 是否大于索引处的当前项目应该可以工作(因为它似乎是一个有序列表)(为什么所有差异都是 +40 的任何原因?)
  • 如果数字是排序好的(就像这里一样),你可以使用二分搜索在 O(log n) 时间内找到答案,而不是 O(n) 时间。

标签: javascript arrays algorithm


【解决方案1】:

这是一个使用Array.forEach()的方法:

const number = 165;
const candidates = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

//looking for the lowest valid candidate, so start at infinity and work down
let bestCandidate = Infinity;

//only consider numbers higher than the target
const higherCandidates = candidates.filter(candidate => candidate > number);

//loop through those numbers and check whether any of them are better than
//our best candidate so far
higherCandidates.forEach(candidate => {
    if (candidate < bestCandidate) bestCandidate = candidate;
});

console.log(bestCandidate); //the answer, or Infinity if no valid answers exist

【讨论】:

  • 完美运行。显示自定义消息而不是 Infinity 的任何方式。
  • 您需要在末尾添加一个额外的if (bestCandidate === Infinity) { 子句来捕捉这种情况并显示不同的内容。
  • 我必须将其设置为 -1,这是值。它是未定义的,因为它在不存在的数组中查找该数字。
【解决方案2】:

您需要在插入后对数组进行排序:

let list = [10, 20, 50];
let elementToInsert = 40;
list.push(elementToInsert);
list.sort(function(a, b) {
  return a - b;
});

返回必须是 [10, 20, 40, 50]

【讨论】:

    【解决方案3】:

    您可以通过对数组进行排序并对其进行迭代来找到满足您条件的第一个值来完成此操作:

    const getFirst = (arr, predicate) => {
      for (const val of arr) {
        if (predicate(val)) return val;
      }
      return undefined;
    }
    
    const x = getFirst([2, 42, 82, 122, 162, 202, 242, 282, 322, 362].sort(), x => x > 165);
    
    console.log(x);

    【讨论】:

      【解决方案4】:

      给你具体的例子:

      var array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
      var found = array.find(function(element) {return element > 165;});
      

      当您登录 found 时,您将始终得到 202。

      这将始终返回大于您的数字的第一个元素, 逻辑上最接近且更高

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多