Вот универсальный алгоритм смены цикла array
на shiftCount
элементов и пропуска skippedElements
в начале и в конце array
:
var array = new char[] {'a', 'b', 'c', 'd', 'e', 'f'};
var skippedElements = 1;
var shiftCount = 1;
bool shiftLeft = true;
if (shiftLeft)
{
// shift left
Array.Reverse(array, skippedElements, shiftCount);
Array.Reverse(array, skippedElements + shiftCount, array.Length - skippedElements * 2 - shiftCount);
Array.Reverse(array, skippedElements, array.Length - skippedElements - shiftCount);
}
else
{
// shift right
Array.Reverse(array, skippedElements, array.Length - skippedElements * 2);
Array.Reverse(array, skippedElements + shiftCount, array.Length - skippedElements * 2 - shiftCount);
Array.Reverse(array, skippedElements, shiftCount);
}
Это модификация для Алгоритм разворота для вращения массива . Работает на skippedElements > 0
. не требует дополнительных переменных или памяти.