Для l oop не продолжается, как ожидалось в Java? - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь написать код, чтобы обратить вспять увеличивающиеся подмассивы в 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}```

1 Ответ

1 голос
/ 12 февраля 2020

Вы оглядываетесь назад, сравнивая items[i] с items[i-1]. Но тогда как найти конец последней возрастающей последовательности, когда она заканчивается на последнем индексе? Это вызвало ошибку.

Вероятно, решено с помощью if (i != items.length - 1 && items[i] > items[i-1]).

Также можно исключить тогдашнюю часть if (items[i] > items[i-1]), просто отвечая, когда последовательность заканчивается (items [i] <= items [i-1] `. </p>

Чистое кодирование этой логики c:

  • в положении i определяет начало последовательности и конец
  • реверс [начало. . end].

приводит к:

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;
        }
    }
}

Можно исключить первое while, определяющее подпоследовательность, удерживая переменные состояния перед for-l oop, но вышеуказанное проще всего.

Сокращение строк кода с 17 Lo C до 12 Lo C.

...