我必须在数组中找到第一个重复值,然后在变量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);控制台打印出1,这很好,因为2是第一次复制,但是当我在数组中更改数字时,循环不工作。你能告诉我这里有什么可以改变吗?
提前感谢!
发布于 2016-09-06 10:07:31
使用以下内容更改代码
var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
var firstIndex = "";
var isMatch=false;
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]);
isMatch=true;
break;
}
}
if (isMatch) {break;}
}
console.log(firstIndex);发布于 2016-09-06 10:26:21
如果我正确理解了你的问题,那会对你有帮助.基本上,您需要进行双重迭代。
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])
);
上面的实现具有O(n2)的缺点,因为在findIndex函数中嵌套了findIndex。
一个更好的解决方案是通过构建一个字典来索引所出现的情况,从而在最坏的情况下将时间复杂度保持在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'])
);
发布于 2016-09-06 10:08:24
我会用一个对象来记住已经找到的值..。这样的事情应该有效;)
var numbers4 = [5, 2, 3, 4, 4, 6, 7, 1, 2, 3];
function findFirstDuplicateIndex(arr){
var found = {};
for (var a = 0, aa = arr.length; a < aa ; a++) {
if (found[arr[a]])
return found[arr[a]];
found[numbers4[a]] = a
}
}
console.log(findFirstDuplicateIndex(numbers4));
它非常快,因为您只循环了一次数组。其余的时间,您只访问对象属性或设置对象属性.(如果你有问题,请告诉我;)
但是也许有更快的..。这只是一个想法^^
PS:它也适用于单词,而不仅仅是数字。
https://stackoverflow.com/questions/39346182
复制相似问题