我正在尝试编写一个javascript代码,以便从第二次出现最小索引的arrayn中找到第一个重复的数字。我已经编写了该函数,除了测试用例外几乎所有给定的数组都能正常工作如下所示。
输入: a:[1,1,2,2,1] 输出: 2 预期产出: 1
javascript代码如下所示
function firstDuplicate(a) {
var firstIndex = "";
var isMatch = false;
for (var i = 0; i <= a.length; i++) {
for (var j = i + 1; j <= a.length; j++) {
alert(a[i] + "," + a[j]);
if (a[i] === a[j]) {
firstIndex = j;
isMatch = true;
break;
}
}
}
if (isMatch)
return a[firstIndex];
else
return -1;
}
程序在第二个for循环中使用alert语句进行窃听。我发现a [i]和a [j]的值在循环本身的第一次执行中是相同的,但是下面的if条件失败了。我想知道这是怎么发生的,任何人都可以解释为什么会发生这种情况?
答案 0 :(得分:1)
如果 ,则只应设置firstIndex
。
此外,您的循环边界不正确。他们应该<
而不是<=
。
console.log(firstDuplicate([1, 1, 2, 2, 1])); // 1
console.log(firstDuplicate([2, 3, 3, 1, 5, 2])); // 3
console.log(firstDuplicate([2, 4, 3, 5, 1])); // -1
function firstDuplicate(a) {
var firstIndex = Infinity;
var isMatch = false;
for (var i = 0; i < a.length; i++) {
for (var j = i + 1; j < a.length; j++) {
// ---------------vvvvvvvvvvvvvvvvv
if (a[i] === a[j] && j < firstIndex) {
firstIndex = j;
isMatch = true;
break;
}
}
}
if (isMatch)
return a[firstIndex];
else
return -1;
}
&#13;
这是另一种写作方式:
console.log(firstDuplicate([1, 1, 2, 2, 1])); // 1
console.log(firstDuplicate([2, 3, 3, 1, 5, 2])); // 3
console.log(firstDuplicate([2, 4, 3, 5, 1])); // -1
function firstDuplicate(a) {
let idx = Infinity;
for (const [i, n] of a.entries()) {
const dupIdx = a.indexOf(n, i+1);
if (dupIdx !== -1 && dupIdx < idx) {
idx = dupIdx;
}
}
return isFinite(idx) ? a[idx] : -1;
}
&#13;
答案 1 :(得分:0)
您可以采用单循环方法,使用哈希表来指示访问过的项目。
function firstDuplicate(array) {
var hash = Object.create(null),
i = 0,
l = array.length,
item;
while (i < l) {
item = array[i];
if (hash[item]) {
return item;
}
hash[item] = true;
i++;
}
return -1;
}
console.log(firstDuplicate([1, 1, 2, 2, 1])); // 1
console.log(firstDuplicate([2, 3, 3, 1, 5, 2])); // 3
console.log(firstDuplicate([2, 4, 3, 5, 1])); // -1