JavaScript实现LeetCode两数之和:数组副本同步变更问题求助
解决LeetCode两数之和中的数组引用问题
问题描述
我在用JavaScript解决LeetCode两数之和问题时,实现了一个通过修改nums数组首尾元素来找到目标和的算法,但保存的原数组副本会随原数组修改同步变更,导致无法获取正确索引。尝试过把原数组定义为函数或类都没用,想问怎么解决。
原代码:
const searchAlgorithm = (nums, target) => { nums = nums.sort((a, b)=>a-b); while(true){ total = nums[0]+nums[nums.length-1]; if(total>target){ nums.splice(nums.length-1, 1); } else{ if(total==target){ answers = [nums[0], nums[nums.length-1]]; return answers; } else{ nums.splice(0, 1); } } } } const twoSum = (nums, target)=>{ original = nums; [num1, num2] = searchAlgorithm(nums, target); answers = [original.indexOf(num1, 0), original.indexOf(num2, 0)]; return (answers); } console.log(twoSum([3,6,8,2,11], 5));
问题根源
- JavaScript中数组是引用类型,
original = nums只是复制了指向原数组的内存引用,并没有创建新数组。所以当你在searchAlgorithm里用sort(原地排序)、splice(原地修改)操作nums时,original指向的是同一个数组,自然会同步变化。 sort方法本身会原地修改数组,直接污染了传入的原数组。
解决方案
- 创建原数组的独立副本:用
[...nums]、nums.slice()或Array.from(nums)生成原数组的浅拷贝,让副本和原数组完全独立。 - 在搜索算法内操作副本:不要直接修改传入的nums数组,先在
searchAlgorithm内部创建数组副本,再对副本进行排序和修改,避免影响原数组。 - 处理重复元素的索引问题:如果数组存在重复数字,直接用
indexOf会拿到第一个匹配项的索引,第二个索引需要从第一个索引的下一位开始查找。
修改后的代码
const searchAlgorithm = (nums, target) => { // 创建数组副本,避免修改原数组 const numsCopy = [...nums].sort((a, b) => a - b); while (true) { const total = numsCopy[0] + numsCopy[numsCopy.length - 1]; if (total > target) { numsCopy.splice(numsCopy.length - 1, 1); } else { if (total === target) { return [numsCopy[0], numsCopy[numsCopy.length - 1]]; } else { numsCopy.splice(0, 1); } } } } const twoSum = (nums, target) => { // 创建原数组的独立副本 const original = [...nums]; const [num1, num2] = searchAlgorithm(nums, target); let index1 = original.indexOf(num1); // 处理重复元素:若两数相等,第二个索引从index1+1开始查找 let index2 = num1 === num2 ? original.indexOf(num2, index1 + 1) : original.indexOf(num2); return [index1, index2]; } console.log(twoSum([3,6,8,2,11], 5)); // 输出 [0, 3],对应原数组的3和2
内容的提问来源于stack exchange,提问作者Jackson Rodgers
相关产品推荐
相关产品推荐

