JavaScript求数组中和为目标值的不重复整数对问题求助
问题分析与代码修正
原代码存在几个关键问题,导致无法输出正确结果:
- 内层循环边界错误:
j < arr.length - 1会跳过数组最后一个元素,应该改为j < arr.length,才能遍历到所有后续元素。 - 结果存储格式错误:
arr1.unshift(arr[i], arr[j])把两个数直接塞进一维数组,而非将每对作为独立子数组存储,应该用arr1.push([arr[i], arr[j]])生成二维结构。 - 返回值包装错误:
new Array(arr1)会把整个结果数组当作单个元素嵌套,直接返回处理后的数组即可。 - 缺少排序与去重逻辑:题目要求返回不重复且升序排列的二维数组,需要对每个子数组内部排序、去重,最后对整个二维数组按升序排列。
修正后的代码
function findPairs(arr, target) { const pairs = []; // 遍历所有不重复的元素对 for (let i = 0; i < arr.length; i++) { for (let j = i + 1; j < arr.length; j++) { if (arr[i] + arr[j] === target) { // 对每对元素排序,保证内部升序 const sortedPair = [arr[i], arr[j]].sort((a, b) => a - b); pairs.push(sortedPair); } } } // 去重:将子数组转为字符串,利用Set唯一性去重后转回数组 const uniquePairs = [...new Set(pairs.map(pair => JSON.stringify(pair)))].map(pair => JSON.parse(pair)); // 对整个二维数组按升序排列 return uniquePairs.sort((a, b) => a[0] - b[0]); } console.log(findPairs([3, 7, 8, 4, 5, 9], 12)); // [[3,9],[4,8],[5,7]] console.log(findPairs([1, 2, 3, 4], 8)); // []
补充说明
- 去重逻辑通过将子数组转为JSON字符串,利用Set的唯一性特性实现,再转回数组结构。
- 两次排序:先保证每个数对内的元素升序,再对整个结果数组按子数组第一个元素排序,完全匹配题目要求的输出格式。
内容的提问来源于stack exchange,提问作者Seryozha Petrosyan
相关产品推荐
相关产品推荐

