You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法本身会原地修改数组,直接污染了传入的原数组。

解决方案

  1. 创建原数组的独立副本:用[...nums]、nums.slice()或Array.from(nums)生成原数组的浅拷贝,让副本和原数组完全独立。
  2. 在搜索算法内操作副本:不要直接修改传入的nums数组,先在searchAlgorithm内部创建数组副本,再对副本进行排序和修改,避免影响原数组。
  3. 处理重复元素的索引问题:如果数组存在重复数字,直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:50:28