Как может выглядеть альтернативное решение?
Задача звучит так:
Перейдите в класс CycleSwap и реализуйте его статические методы:
void cycleSwap(int[] array)
Сдвигает все элементы в данном массиве вправо на 1 позицию.
В этом случае последний элемент массива становится первым.
Например, 1 3 2 7 4 становится 4 1 3 2 7.
void cycleSwap(int[] array, int shift)
Сдвигает все элементы в заданном массиве вправо на shift позиций.
Гарантируется, что значение сдвига неотрицательное и не больше длины массива.
Например, 1 3 2 7 4 со сдвигом 3 становится 2 7 4 1 3.
Для большего интереса при выполнении задания попробуйте не использовать циклы в своем коде (это не обязательно).
Обратите внимание, что входной массив может быть пустым.
Мое решение:
class CycleSwap {
static void cycleSwap(int[] array) {
if(array.length > 0){
int lastElement = array[array.length-1];
for (int i = array.length-1;i>0;i--){
array[i] = array[i-1];
}
array[0] = lastElement;
}
}
static void cycleSwap(int[] array, int shift) {
if(array.length > 0){
for(int i = 0; i < shift; i++){
int lastElement = array[array.length-1];
for(int j = array.length-1;j>0;j--){
array[j] = array[j-1];
}
array[0] = lastElement;
}
}
}
}
Как выглядит альтернативное решение без использования циклов?
Ответы (2 шт):
Ну навскидку 2 варианта без циклов:
- Реализуете логику "условно" своих итераторов - попросту ставите указатель, который обозначает начало массива. И когда надо сдвинуть массив вы его не сдвигаете. а сдвигаете указатель на начало. Но тогда при доступе к массиву идете по принципу
(указатель на начало) -> (конец массива) -> (начало массива) -> (указатель на начало)-1 - Копируете блоки в новый массив а старый удаляете.
Вижу несколько путей развития:
- Рекурсивный подход и реализация
cycleSwap(int[] arr, int shift)в рамкахcycleSwap(int[] arr)
public void cycleSwap(int[] arr, int shift) {
if (shift <= 0) {
return;
}
cycleSwap(cycleSwap(arr), --shift);
}
- Реализация
cycleSwap(int[] arr)черезSystem.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
public void cycleSwap(int[] arr) {
if (arr.length == 0) {
return;
}
int last = arr[arr.length - 1];
System.arraycopy(arr, 0, arr, 1, arr.length - 1);
arr[0] = last;
}