Как уже говорилось, цель состоит в том, чтобы начать с этого массива:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
И изменить его так, чтобы вы получили следующее:
[10, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Что вы здесь делаетепо сути, толкает каждое число на одну позицию вправо.Самый правый номер, когда «сдвинут на одну точку вправо», будет перенесен на начало массива.
Если мы начнем с того, что просто берем первое число и копируем его вправо, мы запускаемв проблему.Начало массива [1, 2]
теперь [1, 1]
... что означает, что мы больше не знаем, какой номер нужно продвинуть в третий слот.Другими словами, если мы просто слепо начинаем с начала массива и толкаем числа вправо, мы получим следующее:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Лучший способ решить эту проблему - это сделатьработа начиная с конца массива , а затем работа в обратном направлении.Итак, сначала мы нажимаем 9
вправо, затем 8
и т. Д.
Как только мы это сделаем, единственная проблема - это то, что мы делаем с первой позицией.Если бы мы просто переместили все на единицу, у нас было бы следующее:
[???, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Что еще хуже, мы могли бы фактически вывести программу из строя, пытаясь получить доступ к «отрицательному 1-му» элементу, чтобы переместить его.к нулевому индексу.
Лучший способ обойти this - разбить нашу задачу на три этапа:
- Сохранить последнее число в массиве дляпозже
- Для каждой позиции, начиная с конца и возвращаясь ко второй позиции, установите число равным номеру в позиции перед ним
- Установите первое число в массивена сохраненный «последний» номер
Вот как это выглядит в коде:
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int last = numbers[numbers.length - 1]; // last now stores 10
// for index 9 to index 1, copy numbers to the right
for (int i = numbers.length - 1; i > 0; --i) {
numbers[i] = numbers[i - 1];
}
numbers[0] = last; // the first number is now 10