【问题标题】:Two Sum confusing bug两个 Sum 令人困惑的错误
【发布时间】:2021-07-04 22:14:04
【问题描述】:

我正在尝试解决一个关于 leetcode 的初学者问题。

给定一个整数数组 nums 和一个整数 target,返回这两个数字的索引,使它们相加为目标。

我的解决方案在某些测试用例上运行良好,但在这方面失败了:

*

Example:
Input: nums = [3,3], target = 6
Output: [0,1]

这是我的代码:

let nums = [3, 3];
let target = 6;
var twoSum = (nums, target) => {
    for (let i = 0; i < nums.length; i++) {
        let result = [];
        if (target === nums[i] + nums[i + 1]) {
            result.push(nums.indexOf(nums[i]));
            result.push(nums.indexOf(nums[i + 1]));
            return result;
        }
    }
};

console.log(twoSum(nums, target));

这里的输出是[0,0],而不是[0,1]

逻辑哪里出错了?我清楚地将nums[i + 1] 作为第二个值推送到数组中。

【问题讨论】:

  • indexOf 返回找到值的第一个索引。只需推送ii + 1
  • result.push(i + 1) ?您的算法也不起作用,它只能找到连续的解决方案。尝试例如[1, 0, 1] 与目标 2。
  • 作为旁注:一个有效的算法可以在 O(1/2 * n) 中解决这个问题,以防有人想自己写一个解决方案(公开回答“挑战”在某种程度上击败了挑战的目的)
  • 让我们开始说 nums.indexOf[nums[i]] 等于 i
  • 谢谢大家的回答,我应该多看一下代码,现在在你们指出之后,代码看起来真的很愚蠢!

标签: javascript


【解决方案1】:

您的算法不正确,因为元素不需要彼此相邻。相反,您应该使用嵌套循环来添加数组的每个元素及其后的每个元素。

var twoSum = (nums, target) => {
    for (let i = 0; i < nums.length; i++) {
        for(let j = i + 1; j < nums.length; j++){
           if(nums[i] + nums[j] === target) return [i, j];
        }
    }
};

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多