【问题标题】:Code after if block inside a for loop doesn't work在 for 循环内的 if 块之后的代码不起作用
【发布时间】:2018-01-26 10:55:12
【问题描述】:

我是 Java 新手。这是一个关于 for 循环中的 if 块的问题。此代码来自算法实践。 代码是取一个 int 数组,但将其视为一个整数,并在该整数上加一,并将新整数转换回数组格式。如果我没有描述清楚,请参考原文here

    public static int[] plusOne(int[] digits) {

    int size = digits.length;
    for(int i=size-1; i>=0; i--) {
        if(digits[i] < 9) {
            System.out.println("tag1 digits.i = " + digits[i]);
            digits[i]++;
            System.out.println("tag2 digits.i = " + digits[i]);
            return digits; // <-- return
        }

        System.out.println("tag3 digits.i= " + digits[i]);
        digits[i] = 0; //?
        System.out.println("tag4 digits.i= " + digits[i]);
    }

    int[] intOut = new int [size+1];
    intOut[0] = 1;
    return intOut;
}

在上面的代码中,我添加了一些 println() 来显示digit[i] 的变化。

当输入为{1,2,3}时,为什么digits[i] = 0这行不起作用?阅读代码我以为int[] digits中的所有int都会设置为0。

如果在 if 块中是return是否意味着停止当前迭代并忽略 if 块之后的 for 循环中的其余代码?

更新我没有清楚地描述它。我的问题不是关于用代码完成什么以及如何完成,而是关于给定我提到的输入,为什么 if 语句之后的代码不起作用.现在我了解到 if 块最后一行的 return 语句意味着执行它(停止当前迭代)。对不起这个愚蠢的问题..!

【问题讨论】:

  • 看来你需要学习使用调试器了。请帮助自己一些complementary debugging techniques。如果您之后仍有问题,请随时回来提出更具体的问题。
  • 你永远不会到达digits[i] = 0;,因为如果digits[i] &lt; 9,你就会返回。
  • 你的digits数组没有大于9的值,试试数组{1,2,3,4,5,6,7,8,9,11,12,13,14}
  • @DevelopingDeveloper 不会有所作为;它返回第一个元素。
  • 如果在 if 块中返回,是否意味着停止当前迭代并忽略 if 块后 for 循环中的其余代码? 是的,return 退出方法。你认为它有什么作用?

标签: java for-loop if-statement return


【解决方案1】:

您的代码将作为数字数组传递的数字加一。

所以当你把 1 加到 123 时,你得到 124。代码从最后一位开始,看它是否小于 9,然后只在最后一位上加 1。 这发生在 if 块中。 return 结束函数

只有在溢出时才会到达将数字设置为 0 的代码。仅当您传递最后一位数字为 9 的数字时,才会发生这种溢出。

要达到这种情况,您必须传递类似 129(或 {1,2,9})的内容。然后最后一位变为 0,并检查倒数第二位。本例加一,返回 130

要到达循环后面的代码,您必须传递一个所有数字都设置为 9 的列表。例如 99(或 {9,9})。

在这种情况下,最后一个数字将设置为 0,第一个数字将设置为 0,然后将生成一个新的列表,其中包含多一个数字。最初所有数字都设置为 0。然后第一个数字将设置为 1。结果为 100。

return 离开函数/方法 break 离开周围的循环(for,while)

所以粗体字的答案是YES

【讨论】:

    【解决方案2】:

    对于下面的循环:

    for(int i=size-1; i>=0; i--) {
        if(digits[i] < 9) {
            System.out.println("tag1 digits.i = " + digits[i]);
            digits[i]++;
            System.out.println("tag2 digits.i = " + digits[i]);
            return digits;
        }
    
        System.out.println("tag3 digits.i= " + digits[i]);
        digits[i] = 0; //?
        System.out.println("tag4 digits.i= " + digits[i]);
    }
    

    digit[i] &lt; 9 的那一刻,它将进入if 条件。但之后它会返回digit[] 并退出该方法。

    因此您永远不会看到 digit[i] &lt; 91 到 8 被设置为 0。

    【讨论】:

    • 不是 1 到 8,而是 0 到 8 永远不会设置为 0,或者更简单的只有 9 会导致溢出,这意味着设置为 0,并转到上一个数字跨度>
    • 是的,但是 0 将作为任何数字递增!= 9。
    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多