如何优化这段JavaScript代码?查找数组中和为8的元素索引
问题分析与代码优化
原代码存在几个关键问题:
- 循环变量从1开始,混淆了**数组索引(从0开始)**和元素值的概念
- 错误计算了
i + j的和,实际应该是数组对应索引的元素相加:arr[i] + arr[j] - 使用
arr.indexOf(i)获取索引会导致错误(比如数组有重复值时返回第一个匹配项),且这里的i是循环变量而非数组元素 - 双重循环会重复遍历相同的元素对(如索引[2,3]和[3,2]会被重复处理),效率较低
优化方案1:优化暴力循环(时间复杂度O(n²))
修正索引逻辑,避免重复检查,直接输出符合条件的索引对:
const arr = [1, 2, 3, 4, 5]; const sum = 8; // 外层循环从第一个元素到倒数第二个 for (let i = 0; i < arr.length - 1; i++) { // 内层循环从i的下一个元素开始,避免重复检查 for (let j = i + 1; j < arr.length; j++) { if (arr[i] + arr[j] === sum) { console.log(`符合条件的索引对:[${i}, ${j}]`); } } }
输出结果:
符合条件的索引对:[3, 4]
优化方案2:哈希表法(时间复杂度O(n))
通过哈希表存储元素值与索引的映射,一次遍历即可找到目标,效率更高:
const arr = [1, 2, 3, 4, 5]; const sum = 8; const map = new Map(); for (let i = 0; i < arr.length; i++) { const target = sum - arr[i]; // 检查哈希表中是否存在目标值,且不是当前元素本身 if (map.has(target)) { console.log(`符合条件的索引对:[${map.get(target)}, ${i}]`); } // 将当前元素和索引存入哈希表 map.set(arr[i], i); }
输出结果:
符合条件的索引对:[3, 4]
内容的提问来源于stack exchange,提问作者Jenish R. Chanchad
相关产品推荐
相关产品推荐

