当前位置: 首页 > 知识库问答 >
问题:

抛出异常时可以退出循环吗?

尚景焕
2023-03-14

我在Hackerrank上解决了一个任务。com,问题是这样的:

你有一个数组。这个数组包含数字。
现在输入两个数字:

  • 第一个描述了一个总和
  • 第二个描述了您添加在一起的索引量(序列长度)

最后你得到的序列的数量其总和就是你定义的数字

例如:

我为此写了这段代码:

static int GetSequences(List<int> s, int d, int m)
{
    //m = segment-length
    //d = sum

    int count = 0;
    int j = 0;
    int k = 0; 

    do
    {
        try
        {
            List<int> temp = new List<int>();

            for (int i = 0; i < m; i++)
            {
                temp.Add(s[i + k]);
            }
            if (temp.Sum() == d)
            {
                count++;
            }
            j++;
            k++;
        }
        catch (ArgumentOutOfRangeException)
        {
            break;
        }

    } while (true);

    return count;
}

由于我不知道需要多少次计数(例如,序列长度为3的6长度数组有4个序列(1,2,3,4 | 3,4,5 | 4,5,6)),当索引超出范围时,我停止循环。但我不确定这个解决方案是否可行。不仅仅是程序速度,还有代码清洁度。该代码是否可以接受,或者最好使用循环,例如,对于具有3个长度序列的6个长度数组,哪些循环正好4次?

共有3个答案

郎慎之
2023-03-14

通常,除了开关/机箱外,通常没有使用break的真正原因。此外,例外必须如名称所示,因此它不能成为您逻辑的一部分。正如Jeppe所说,您可以使用框架提供的方法和属性来执行您喜欢的操作。在这里,s.Count似乎是一条可行之路。

南宫才英
2023-03-14

最好修复代码,使其不会经常引发异常

您对这些段中的每一个进行求和:

0  1  2  3    start = 0
|  |          summing indexes: 0, 1
+--+

0  1  2  3    start = 1
   |  |       summing indexes: 1, 2
   +--+

0  1  2  3    start = 2
      |  |    summing indexes: 2, 3
      +--+

括号从索引开始,大小为m。s的长度由s.Count给出。因此,我们希望继续进行,直到开始m==s.Count。

(我总是发现画出这些东西并输入样本编号很有用,以确保您的数学正确。在上面的示例中,您可以看到我们在start(2)m(2)==数组大小(4)时停止)

static int GetSequences(List<int> s, int d, int m)
{
    //m = segment-length
    //d = sum

    int count = 0;

    for (int start = 0; start + m <= s.Count; start++)
    {
        List<int> temp = new List<int>();
        for (int i = 0; i < m; i++)
        {
            temp.Add(s[start + i]);
        }
        if (temp.Sum() == d)
        {
            count++;
        }
    }

    return count;
}

但是,您可以稍微改进代码:

  1. 使用有意义的变量名
  2. 不要每次都创建一个新的临时列表,只是为了求和
  3. 检查您的输入
static int GetSequences(List<int> numbers, int targetSum, int segmentLength)
{
    if (numbers == null)
        throw new ArgumentNullException(nameof(numbers));
    if (segmentLength > numbers.Count)
        throw new ArgumentException("segmentLength must be <= numbers.Count");

    int count = 0;

    for (int start = 0; start + segmentLength <= numbers.Count; start++)
    {
        int sum = 0;
        for (int i = 0; i < segmentLength; i++)
        {
            sum += numbers[start + i];
        }
        if (sum == targetSum)
        {
            count++;
        }   
    }
}
邹丰羽
2023-03-14

不建议这样做。应该为不应该发生的事情保留例外,而不是流控制或验证。

您想要的是使用条件逻辑(if语句)和关键字。

此外,codereview。stackexchange。com更适合于这类问题。

 类似资料:
  • 我在我的android应用程序中使用增强for循环来迭代状态对象列表。 这将生成以下IndexOutOfBoundsException:java。lang.IndexOutOfBoundsException:索引0无效,大小为0 我意识到这是因为ArrayList的大小是0,这意味着它是空的。我的问题是,为什么它一开始就进入了循环,而不是为了保证这些问题不会发生而创建的增强for,以及如何阻止它。

  • 问题内容: 我有一个循环正在我的PHP代码中进行一些错误检查。原来看起来像这样… 这一切都很好,但是尽管有一个错误,它仍然可以循环通过。有没有办法摆脱循环? 问题答案: 您正在寻找break语句。

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • 编辑:该问题与fscanf的while循环没有直接关系,而是在用于包含使用fscanf加载的变量的结构的分配中出现了错误 我正在从文件中读取值,并使用它们在使用fscanf的结构中设置参数。我使用Eclipse作为编辑器,并将其调试和gcc作为编译器(从Eclipse内部)。 我下面介绍的由三部分组成:1)我从文件中读入变量的结构的声明。2)我正在读取的文件,以及3)实际从文件中读取的代码。 在所

  • 问题内容: 我试图在Netbeans中重构一个大型程序,但我有点迷茫。我从来没有非常模块化,但是现在通过实际学习如何做到这一点来尝试纠正这种情况,并在将来纠正这种情况。不幸的是,我在将某些教程翻译成我的程序时遇到了麻烦。所以我希望这里有人可以帮忙。目前,我正在尝试分解一部分采用特定格式的文件并制成表格的代码。我知道我需要创建一个类并使用它来创建表对象,但是我不确定如何做。我有一个主文件,用于获取文