#algorithm
#алгоритм
Вопрос:
У меня есть массив из n элементов, и я хочу написать функцию для переключения элементов между массивом следующим образом :
1 2 3 —> 3 1 2 —> 2 3 1 —> 1 2 3
Я не могу придумать простой алгоритм для этого. Пожалуйста, помогите. Это не домашнее задание.
Комментарии:
1. Если вы просто вращаете массив — зачем? Просто предоставьте интерфейс для доступа к массиву, который может справиться с модульной индексацией. т. е. может начинаться в любом месте этого массива и возвращаться к нулю, когда это необходимо.
2. Почему отрицательные голоса? Это совершенно разумный, хотя и несколько простой, вопрос. Существуют веские причины для того, чтобы захотеть повернуть массив на месте.
Ответ №1:
Используйте очередь вместо списка. Ставьте в очередь элемент, исключенный из очереди, для каждого шага.
Другой альтернативой является использование циклического буфера. Просто оставьте массив как есть и имейте указатель на первый элемент, перемещайте указатель на каждом шаге. Считывание массива в два этапа. 1. От указателя до конца. 2. От начала до указателя.
Третья альтернатива — просто менять местами элементы один за другим.
int tmp = arr[0];
for(int i = 0; i < arr.Length - 1; i )
{
arr[i] = arr[i 1];
}
arr[arr.Length - 1] = tmp;
Комментарии:
1. Я думаю, у вас здесь ошибка. Вы можете увидеть это, если длина вашего массива равна 2. В этом случае код внутри цикла никогда не будет выполнен, и ваш массив будет иметь то же значение в
arr[0]
иarr[1]
. Ваше управление циклом должно быть либоi < arr.Length - 1
, либоi <= arr.Length - 2
.
Ответ №2:
Вы просто хотите повернуть массив?
// Rotate left
int temp = a[0];
for (int i = 0; i < a.Length-1; i)
a[i] = a[i 1];
a[a.Length-1] = temp;
// Rotate right
int temp = a[a.Length-1];
for (int i = a.Length-1; i > 0; --i)
a[i] = a[i-1];
a[0] = temp;