我正在开发一个通过所有测试的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;
}
您可以获取对象的强大功能以及可用作数组索引的键的标准排序(正32位数)。
这种尝试有两个部分
此代码在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];
}