缺少数字算法超时错误(JavaScript)

问题描述 投票:-1回答:1

我正在开发一个通过所有测试的Codewars Kata,除了它保持超时。任何人都可以就如何优化这个提供建议吗?提前致谢!这是问题细分 -

在这个kata中,我们有一个从a到b的连续数字的未排序序列,因此a <b始终(记住a,是最小值,b是最大值)。

在这个序列中引入了一个未知数量的重复项,我们知道只有一个缺失值,所有重复值和缺失值都在a和b之间,但从不与它们重合。

找到带有重复数字的缺失数字(重复数据应在排序数组中输出)。

我们来看一个例子:

arr = [10,9,8,9,6,1,2,4,3,2,5,5,3]

find_dups_miss([10,9,8,9,6,1,2,4,3,2,5,5,3])== [7,[2,3,5,9]]

这是我的解决方案 -

function findDupsMiss(arr) {
  let missingNum = [];
  let newArr = [];
  arr = arr.sort((a, b) => a - b);
  let dup = [...new Set(arr)];
  for (let y = 1; y < dup.length; y++) {
    if (dup[y] - dup[y - 1] != 1) missingNum.push(dup[y] - 1)
  } 
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) newArr.push(arr[i])
    }
  }
  missingNum.push(newArr);
  return missingNum;
}
javascript arrays big-o nested-loops
1个回答
1
投票

您可以获取对象的强大功能以及可用作数组索引的键的标准排序(正32位数)。

这种尝试有两个部分

  1. 统计所有数字
  2. 迭代对象的所有键及其外观和 检查实际项目和上一项目之间是否有缺失的数字。如果是,请指定缺失值, 如果计数大于1,请检查计数并按下键。

此代码在7410毫秒内完成。

function findDupsMiss(arr) {
    var hash = Object.create(null),
        i = arr.length,
        l,
        v,
        keys,
        missing,
        dupes = [],
        previous, item;

    while (i--) {
        v = arr[i];
        if (!hash[v]) {
            hash[v] = 0;
        }
        hash[v]++;
    }
    keys = Object.keys(hash);
    l = keys.length;
    for (i = 0; i < l; i++) {
        item = +keys[i];
        if (previous + 1 !== item) {
            missing = previous + 1;
        }        
        if (hash[item] > 1) {
            dupes.push(item);
        }
        previous = item;
    }
    return [missing, dupes];
}
© www.soinside.com 2019 - 2024. All rights reserved.