【问题标题】:Is there a way to prevent index out of bounds error here?有没有办法在这里防止索引越界错误?
【发布时间】:2021-11-29 19:26:46
【问题描述】:

我是新来的。我正在 Leetcode 上尝试关于最长公共前缀的 C# 问题。我知道这个问题已经解决了很多次。我只是很难理解为什么我的代码在某些条件下不起作用。当输入 ["flower","flow","flight"] 被输入时,它工作得很好并得到输出 "fl"。然而,当我输入 ["ab", "a"] 时,我突然得到一个 IndexOutOfRangeException。有谁知道为什么?这是我的代码:

public class Solution {
public string LongestCommonPrefix(string[] strs) {

    StringBuilder sb = new StringBuilder();
    int h = 1;
    int count = 0; 
    
    if (strs.Length == 1){
        return strs[0];
    }
    
    for (int i = 0; i<strs[0].Length; i++)
    {
         if ((strs[0])[i].Equals((strs[h])[i])){
            count++;
             if (h<strs.Length-1){
                 h++;
             }
         }  
    }      
    
     for (int j = 0; j < count; j++)
     {
         sb.Append((strs[0])[j]);
     }               
   return sb.ToString();       
 }
}

【问题讨论】:

  • 您对“h”变量做出了危险的假设。
  • 你的逻辑对我来说似乎是错误的。我认为您需要某种嵌套循环,一个循环遍历strs,一个循环遍历strs 中每个元素中的字符。也许我不明白。
  • 如果第一个字符串最短怎么办?
  • 您还假设strs 至少有一个元素。它可能是空的。至少,我会添加一个断言来检查。
  • sb.Append((strs[0])[j]); 您正在循环遍历strs[0] 中的第一个count 字符,并将它们作为单独的字符串添加到sb。这真的是你的意图吗?看看String.Substringdocs.microsoft.com/en-us/dotnet/api/…

标签: c# indexoutofrangeexception longest-prefix


【解决方案1】:

您可以通过在 Visual Studio 中制作一个简单的控制台应用程序来进行调试。我在您的代码中添加了 Console.Writeline(strs[0] + strs[h]) 以按原样演示逻辑。在调试中运行您的代码,您可以单步执行并查看引发异常的位置:

请注意,控制台每次都打印相同的内容,并且 strs[h] 只有一个字符长。当您将 i 增加到 1 时,您正在尝试访问单元素数组的第二个元素。

【讨论】:

    【解决方案2】:

    当输入 ["flower","flow","flight"] 输入时,它工作得很好并得到输出 "fl"。但是,当我输入 ["ab", "a"] 时,我突然得到一个 IndexOutOfRangeException。有人知道为什么吗?

    因为写入的算法循环直到i 达到第一个字符串的长度,而不是最短的字符串。这对于花/流/飞行来说很好,因为所有这些字符串都会在i 接近跑出最短字符串的末尾之前找到公共前缀“fl”;当算法确定花中的o 与飞行中的i 不同时,i 为 2,因此代码不会超出范围。

    在 ab/a 的情况下,i 是 1 并且算法尚未确定前缀已经发散,您尝试访问字符串“a”上不存在的索引 1 并得到一个崩溃

    正如 cmets 所指出的,你的 h 逻辑也有问题; h 应该在 i 循环内从 1 开始循环。因为它现在 h 只是增加到 strings-1 的数量并保持在那里,所以本质上你最终只在第一个和最后一个字符串中寻找前缀。如果您的字符串是flower/flight/float/flowing/flowers,您将声明前缀为“flower”,因为仅在 i 分别为 0、1 和 2 时才会考虑飞行/float/flowing

    我建议你用你认为的语言在 cmets 中写出算法,然后尝试将其转换为 c#

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2012-02-26
      • 2014-06-06
      • 2015-03-22
      • 1970-01-01
      • 2021-10-11
      相关资源
      最近更新 更多