首页 > 解决方案 > For循环在Java中没有按预期继续?

问题描述

我正在尝试编写一个代码来反转同一数组中Java中增加的子数组(没有创建新数组)。例如,数组的输入items {2, 3, 4, 2, 1, 2, 3, 7, 8}应该输出{4, 3, 2, 2, 8, 7, 3, 2, 1}。到目前为止,我的代码正在反转第一个增加的子数组,但过去的元素似乎没有循环。

到目前为止,这是我的代码:

public static void reverse(int[] items)
  {
      int start = 0;
      int count = 0;
      for (int i = 1; i < items.length; i++)
      {
          if (items[i] > items[i-1])
          {
              if (count < 1)
              {
                  start = i-1;
                  count ++;
              }
              else
              {
                  count ++;
              }
          }
          else
          {
              int j, k;
              for (j = start; j < count/2; j++)
              {
                  k = items[j];
                  items[j] = items[count - j];
                  items[count - j] = k;
                  j++;
              }
              count = 0;
          }
      }

output:
```{4, 3, 2, 2, 1, 2, 3, 7, 8}```

标签: javafor-loopreverse

解决方案


您正在回顾与items[i]比较items[i-1]。但是,当它在最后一个索引处结束时,如何找到最后一个递增序列的结尾呢?这导致了错误。

可能解决了if (i != items.length - 1 && items[i] > items[i-1])

if (items[i] > items[i-1])也可以消除then 部分,只在序列结束时响应 (items[i] <= items[i-1]`.

纯粹编码这个逻辑:

  • 在位置i确定序列开始和结束
  • 反向[开始..结束]。

结果是:

public static void reverse(int[] items) {
    for (int i = 0; i < items.length; ++i) {
        int start = i;
        int end = i;
        while (end + 1 < items.length && items[end + 1] > items[end]) {
            ++end;
        }
        i = end;
        while (start < end) {
            int temp = items[start];
            items[start] = items[end];
            items[end] = temp;
            ++start;
            --end;
        }
    }
}

可以通过在 for 循环之前保存状态变量来消除第一个while确定子序列的方法,但上述方法是最简单的。

代码行数从 17 LoC 减少到 12 LoC。


推荐阅读