我必须在数组中找到第一个重复值,然后在变量 firstIndex 中返回它的索引。这必须使用 for 循环来完成,它应该在找到第一个重复项后停止。我知道这可能很简单,但我被卡住了。到目前为止,我有这个,但它似乎不起作用:
var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
var firstIndex = "";
for (var a = 0; a < numbers4.length; a++) {
for (var b = a+1; b < numbers4.length; b++) {
if (numbers4[a] === numbers4[b])
firstIndex = numbers4.indexOf(numbers4[a]);
break;
}
}
console.log(firstIndex);
Run Code Online (Sandbox Code Playgroud)
控制台打印出 1 这很好,因为 2 首先是重复的,但是当我更改数组中的数字时,循环不起作用。你能建议这里可以改变什么吗?
提前致谢!
如果我正确理解您的问题,那应该可以帮助您...基本上,您需要进行两次迭代。
const firstDupeIndex = list => list.findIndex(
(item, index) => list.lastIndexOf(item) !== index
);
console.log(
"First Dupe at index:",
firstDupeIndex([5, 2, 3, 4, 4, 6, 7, 1, 2, 3])
);Run Code Online (Sandbox Code Playgroud)
O(n2)由于lastIndexOf在findIndex函数内嵌套了 ,上述实现带有 be 的缺点。
更好的解决方案是通过构建字典来索引您的事件,从而将时间复杂度保持O(n)在最坏的情况下。可能不那么整洁,但在大输入下肯定会更有效率。
const firstDupeIndex = (list) => {
const dict = {};
for (const [index, value] of list.entries()) {
if (dict.hasOwnProperty(value)) {
return dict[value];
}
dict[value] = index;
}
return -1;
};
console.log(
"First Dupe at index:",
firstDupeIndex(['a', 'b', 'c', 'd', 'e', 'b', 'z', 't', 'c'])
);Run Code Online (Sandbox Code Playgroud)