Вот код на C, который не использует никаких внешних функций:
Он вращает строку на месте как вперед, так и назад на любое значение независимо от его размера.
int stringRotate(int value)
{
unsigned long I,J,K;
unsigned long index0;
unsigned long temp1,temp2;
unsigned long length;
length = stringLength;
if (value < 0)
value = length - ((0 - value) % length);
if (value > length)
value = value % length;
J = 0;
index0 = J;
temp1 = stringData[J];
for (I = 0;I < length;I++)
{
K = (J + value) % length;
temp2 = stringData[K];
stringData[K] = temp1;
J = K;
temp1 = temp2;
if (J == index0)
{
J++;
index0 = J;
temp1 = stringData[J];
}
}
return 1;
}
Вращать строку как вперед, так и назад было бы немного утомительно, поэтому лучше делать только вращение вперед и вычислять правильное значение для назад. Также, если значение вращения больше длины строки, тогда мы можем просто обрежьте его, так как результат все равно будет таким же.
value = length - ((0 - value)% length): означает, что если значение поворота является отрицательным, тогда установите значение равным длине строки минус положительный результат от остатка от деления значения на длину строки. Например: поворот строки длиной 10 на -9 позиций будет таким же, как поворот на +1. Вращение одной и той же струны на -19 позиций также будет равно вращению на плюс один.
значение = значение% длины: означает, что если положительное значение больше длины строки, то разделите на длину строки и возьмите остаток. Результат был бы таким же, как если бы мы просто проделали долгий путь.
Чтобы сделать вращение на месте, нам нужно будет перейти по значению вращения, чтобы поменять местами символы, которые находятся так далеко друг от друга. Мы начинаем с нулевой позиции, продвигаемся вперед на величину вращения и продолжаем прыгать на эту величину. если мы пройдем через конец строки, мы просто вернемся к началу. Проблема в том, что если значение является четным числом, мы окажемся там, где мы начали, и пропустим все нечетные символы. Переменная index0 там, чтобы указать, откуда мы начали. Если мы вернемся к этому индексу, то нам нужно продвинуться на одну позицию индекса и продолжить прыжок. Мы продолжаем делать это, пока все персонажи не поменяются местами
На данный момент нам нужны две временные переменные, чтобы выполнить замену на месте. J - начальная позиция. Мы перемещаем символ с индексом J к первой временной переменной. Теперь мы зациклились на длине строки. K - индекс назначения, J плюс значение поворота, завернутое вокруг конца, если необходимо. Переместите символ с индексом K во вторую временную переменную. Поместите символ из индекса J в индекс K, используя первую временную переменную. Кстати, причина, по которой мы не просто перемещаем символ непосредственно из индекса J в индекс K, заключается в том, что из-за последней части цикла индексы могут меняться между циклами, но символы в temp1 не должны.
Теперь мы обмениваем temp1 с temp2.
Эта последняя часть для того, где значение является четным числом, и мы вернулись к тому, с чего начали. Это будет происходить в разы, значение вращения минус один. увеличить индекс J на единицу и сбросить начальные значения. Цикл до конца.
Видеозапись можно посмотреть здесь: https://www.youtube.com/watch?v=TMzaO2WzR24