了解为啥我的 C# 中的二和(LeetCode 问题)代码不适用于 [1,2] 的预期答案

Posted

技术标签:

【中文标题】了解为啥我的 C# 中的二和(LeetCode 问题)代码不适用于 [1,2] 的预期答案【英文标题】:Understanding why my code for the Two Sum (LeetCode problem) in C# does not work for expected answer of [1,2]了解为什么我的 C# 中的二和(LeetCode 问题)代码不适用于 [1,2] 的预期答案 【发布时间】:2022-01-23 23:28:06 【问题描述】:

我正在尝试解决 LeetCode 的二和问题。在这个问题中,给定一个名为 nums 的整数数组和一个包含名为 target 的整数的变量。问题是要求返回一个数组,其中包含两个数字的索引,这些数字加起来就是目标。

例如,您有 nums = [2,7,11,15] 和 target= 9。预期输出将是 [0,1],因为 2+7 = 9。

我的代码(如下所示)适用于上面的示例,但是,它不适用于 LeetCode 检查的第二个示例:nums= [3,2,4], target = [6], expected 结果是 [1,2]

我想知道为什么我的代码不适用于第二个示例,以及如何修改它以使其正常工作。

我用于此问题的代码:

public class Solution 
    public int[] TwoSum(int[] nums, int target) 
        //Initializing i, k and sum variables
        int i=0;
        int k= 0;
        int sum= 0;
        
        for(i=0; i<= nums.Length-1 ; i++) 
        
            

            if(i< nums.Length)
            
                k= i+1;
            
                sum= nums[i] + nums[k];
                
                if(sum== target)
                
                    //Returns an array in the compiler containing the values of i and k.
                    return new int[] i, k;
                 else 
                
                    return new int[0];
                
                
                
             else
            
                return Array.Empty < int > ();
                       

        
        return new int[0]; //Returns an empty array if the solution is not found
    

提前谢谢你!

【问题讨论】:

你在调试器中单步调试过代码吗? 另外,请解释一下“不起作用”是什么意思。它会返回不正确的结果吗?抛出异常? 正如 madreflection 所提到的,理解的第一步是使用调试器逐步完成。如果您在 VS Studio 中编写,请设置一个断点,然后查看步骤按钮以在代码执行时浏览代码。乍一看,您的代码似乎在第一次执行 for 循环时立即返回(您有 return 语句,贯穿始终,因此它永远不会进入循环的下一次迭代)。它第一次工作的原因是因为解决方案恰好在第一次迭代中。 从循环中返回空数组的两个地方看起来很可疑。它们禁止您的代码搜索更多解决方案。 我觉得 LeetCode 中的编译器让我很困惑。我知道我需要做 LeetCode 题来练习,但我觉得在 Visual Studio 上做题比使用他们的编译器更容易。 【参考方案1】:

你的问题是这里的 else 块

        if(sum== target)
        
            //Returns an array in the compiler containing the values of i and k.
            return new int[] i, k;
         else 
        
            return new int[0];
        

当您没有使用索引 0 和 1 命中目标时,您会返回空数组,而不是尝试使用索引 1 和 2。

如果您删除 else 块,您的代码将适用于您给出的示例。

【讨论】:

非常感谢您,汉斯·基利安!我删除了 Else 块,它可以工作。【参考方案2】:

你的问题是 else 块有一个 return 所以你的循环不会工作。

但你可以使用:


// bit more array items to test
var nums = new[]  2, 7, 11, 0, 15, 2, 9 ;
int target = 9;

// Your second test case
// var nums = new[]  3, 2, 4 ;
// int target = 6;

var results = new Dictionary<int, int>();
for (var i = 0; i < nums.Length; i++)

    var currI = nums[i];
    for (var x = 0; x < nums.Length; x++)
    
        var currX = nums[x];
        var sum = currI + currX;

        // just with the correct sum and it is not already in the result
        if (sum == target && i != x && !results.ContainsKey(x))
        
            results[i] = x;
        
    

这将导致

0, 1
1, 5
3, 6

如果您只需要知道第一个组合,请发送.FirstOrDefault()

可以在这里找到完整的工作示例:dotnetfiddle

【讨论】:

谢谢你,马丁!我删除了 Else 块。我的代码只得到第一个答案,但我会尝试更改它,以便它可以显示其他结果。【参考方案3】:

你可以简化你的代码:

using System;

public class Program

    public static void Main()
    
        var nums = new[]  2, 7, 11, 0, 15, 2, 9 ;
        int target = 9;

        for (var i = 0; i < nums.Length; i++)
            for (var x = i; x < nums.Length; x++)
                if (nums[i] + nums[x] == target)
                    Console.WriteLine($"i, x");

    

【讨论】:

谢谢,杰克!是否更喜欢像这样嵌套两个 For 循环,而不是在 If 语句中使用 k= i+1 ? @Evangeline Drink:如果工作正常,没有更好或更坏的方法。我能做的唯一考虑是:测试越少,代码越快。当代码反映在这种情况下称为简单组合的算法时,代码很有趣。不是最后一次使用尽可能少的内存。 @Evangeline Drink:您的程序还需要 2 个嵌套的 for 循环,否则,正如现在编写的那样,您将始终只检查一个值,只检查下一个值,而不是所有其他值。 再次感谢!我查找了简单组合算法,这对于为什么可以使用两个 For 循环来解决这个问题是有道理的。

以上是关于了解为啥我的 C# 中的二和(LeetCode 问题)代码不适用于 [1,2] 的预期答案的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要使用 C# 嵌套类 [重复]

理解二和leetcode问题(Ruby)

二和 Leetcode 解释,Hashmap,Javascript

为啥我的表中的第一节标题没有显示?

LeetCode Q1 二和单遍哈希表不工作

Leetcode 95 不同的二叉搜索树II