【问题标题】:Set a stop point for counter in while loop java在while循环java中设置计数器的停止点
【发布时间】:2015-08-11 19:23:13
【问题描述】:

我在 java 中编写了一个方法,该方法将整数数组作为参数,如果该数组包含三个连续的相邻数字,则返回 true。示例 4、5、6 或 23、24、25。我的方法适用于但有一个例外。

问题是我的计数器增加了超过数组索引。索引将大于或等于数组的大小并引发 IndexOutOfBounds 错误。 我的问题是如何增加 i 直到我达到 i


P.S 我不想在这个方法中使用 For 循环而不是 while 方法!

public class Main {

    public static void main(String[] args) {
        int[] b = {16, 11, 12, 6, 2, 9, 18, 11};
        System.out.println(threeConsecutive(b));

    }
    public static boolean threeConsecutive(int[] a){
        boolean done = false;
        boolean result = true;
        int n = a.length; 
        int i = 0;

        while (!done && i < n){
            if (a[i] + 1 == a[i+1] && a[i] + 2 == a[i+2]) {
                done = true;
                result = true;
                }
            else{
                done = false;
                result = false;
                }
            i++;

        }
        return result;
    }

}

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为它过于本地化。这曾经是一种选择。

标签: java arrays counter


【解决方案1】:

如何增加i 直到i 达到i &lt; array.length 不多。

i &lt; n 已经在这样做了。然而,你真正想要的是i+2 &lt; n,因为你做的是a[i+2]

简化代码:

for (int i=0; i+2<n; ++i) {
    if (a[i]+1 == a[i+1] && a[i]+2 == a[i+2]) {
       return true;
    }
}

return false;

【讨论】:

    【解决方案2】:

    原因是 i 超过了数组的最大长度。

    public static boolean threeConsecutive(int[] a){
     boolean done = false;
     boolean result = true;
     int n = a.length; 
     int i = 0;
    
     while (!done && i < (n-2)){
        if (a[i] + 1 == a[i+1] && a[i] + 2 == a[i+2]) {
            done = true;
            result = true;
            }
        else{
            done = false;
            result = false;
            }
        i++;
    
     }
     return result;
    }
    

    【讨论】:

      【解决方案3】:

      我假设您在访问数组外的元素时遇到问题。因此,如果 i= 7 且 n= 8,那么您试图在 a[i+2] 部分达到 i=9。

      问题是您不需要检查数组中的每个元素,您最多可以检查 n-2 个索引。 一个简单的方法是在进入循环之前将 i 加 2 或从 n 中减去 2。

      您还希望您的 while 语句使用逻辑 OR 而不是逻辑 AND。

      它看起来像这样......

      ...
      i=i+2;
      while(!done || i< n){
      ....
      }
      

      【讨论】:

      • 您的“修复”将&amp;&amp; 更改为|| 是错误的。如果序列不存在,done 将保持为 false,这意味着 while (!done || ...) => while (!false || ...) => while (true || ...) => while (true) => 无限循环
      【解决方案4】:

      您收到 indexOutOfBounds 异常。如果数组有 6 个元素,则最后一个元素的索引为 5。在您的 while 循环条件语句中,您正在检查 i 是否小于 n(这是正确的),但稍后在 if 条件中,您将 1 和 2 添加到索引中。如果 index 为 5,则添加 1 或 2 会使您超出范围。

      public static void main(String[] args) {
              int[] b = {16, 11, 12, 6, 2, 9, 18, 11};
              System.out.println(threeConsecutive(b));
          }
          public static boolean threeConsecutive(int[] a){
              boolean done = false;
              boolean result = true;
              int n = a.length; 
              int i = 0;
      
              while (!done && i < n -2){
                  if (a[i] + 1 == a[i+1] && a[i] + 2 == a[i+2]) {
                      done = true;
                      result = true;
                      }
                  else{
                      done = false;
                      result = false;
                      }
                  i++;
      
              }
              return result;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-28
        • 2017-10-01
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多