不使用哈希表查找数组首个重复元素,现有JS代码返回结果错误如何修复
问题原因分析
原代码的双重循环逻辑是从第i个元素出发,查找它之后所有位置是否存在相等元素,会优先返回数组中最早出现的、存在后续重复值的元素,而不是最早发生重复的配对中的元素。
以示例输入[2,5,5,2,3,5,1,2,4]为例,原代码会先匹配到索引0的2和索引3的2,直接返回2,但实际上索引1的5和索引2的5是更早出现的重复配对,因此原逻辑不符合需求。
修正方案(推荐)
使用哈希集合记录已出现的元素,单次遍历即可得到结果,时间复杂度为O(n),远优于原双重循环的O(n²):
function firstRecurring(input) { // 存储已经遍历过的元素 const seen = new Set(); for (let i = 0; i < input.length; i++) { const current = input[i]; // 当前元素已出现过,就是首个重复元素,直接返回 if (seen.has(current)) { return current; } // 未出现过则加入集合 seen.add(current); } // 遍历完无重复返回undefined return undefined; } console.log(firstRecurring([2,5,5,2,3,5,1,2,4])); // 输出5,符合预期
可选调整:保留双重循环写法(不推荐,性能较差)
如果必须保留双重循环的结构,可调整遍历顺序,每次检查当前位置元素和它之前的所有元素是否重复,也能得到正确结果:
function firstRecurring(input) { for (let j = 1; j < input.length; j++) { // 检查j位置的元素在它之前的区间是否有重复 for (let i = 0; i < j; i++) { if(input[i] === input[j]) { return input[j]; } } } return undefined }
内容的提问来源于stack exchange,提问作者abhishekKumar
相关产品推荐
相关产品推荐

