首页 > 解决方案 > 如何优化检查重复值和缺失值的代码?

问题描述

此代码用于在对它们进行排序后返回重复项,并且还用于返回给定数组的限制之间的缺失值,它已正确执行,但我需要对其重新编码,以便它在比执行时间更短的时间内执行 任何人都可以帮助吗?

function findDupsMiss(arr) {
    // your code here
    var newarr = [];
    var missed;
    var duplicates = [];
    var newdup = []

    arr.forEach((el, i) => {
        if (newarr.includes(el) == false) {
            newarr.push(el)
        }
    })
    var sortedArr = newarr.sort((a, b) => a - b);
    for (var i = 0; i < sortedArr.length - 1; i++) {
        if ((sortedArr[i] + 1) !== sortedArr[i + 1]) {
            missed = sortedArr[i] + 1
        }
    }
    arr.forEach(el => {
        if (arr.indexOf(el) != arr.lastIndexOf(el)) {
            duplicates.push(el)
        }
    })
    duplicates.forEach(el => {
        if (newdup.includes(el) == false) {
            newdup.push(el)
        }
    })


    var lastdup = newdup.sort((a, b) => a - b);
    return [missed, lastdup]
}
findDupsMiss([10, 9, 8, 9, 6, 1, 2, 4, 3, 2, 5, 5, 3])

标签: javascript

解决方案


您可以使用对象计算值并获取它的所有键并按值过滤。

对于缺少的键,找到没有前一个键的值。

function findDupsMiss(arr) {
    let count = {},
        duplicates = [],
        missing;

    for (let value of arr)
        if (value in count) count[value]++;
        else count[value] = -1;

    for (let key in count) {
        if (!count[key]) duplicates.push(+key);
        if (!(key - 1 in count)) missing = key - 1;
    }

    return [missing, duplicates];
}

console.log(findDupsMiss([10, 9, 8, 9, 6, 1, 2, 4, 3, 2, 5, 5, 3]));


推荐阅读