Aquí está el código en C que no utiliza ningún funciones externas: Se gira la cadena en el lugar tanto hacia delante y hacia atrás por cualquier valor no importa lo grande.
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;
}
Para girar la cuerda hacia adelante y hacia atrás sería un poco tedioso por lo que es mejor hacer sólo hacia adelante rotar y calcular el valor correcto para backwards.Also si el valor de rotación es mayor que la longitud de la cuerda , entonces podemos simplemente cortarlo ya que el resultado sería el mismo de todos modos.
value = length - ((0 - value)% length): significa que si el valor de rotación es negativo, establezca el valor en la longitud de la cadena, menos el resultado positivo del resto dividiendo el valor por longitud de la cuerda. Por ejemplo: rotar una cuerda de longitud 10 por -9 posiciones sería lo mismo que rotar por +1. Girar la misma cuerda por posiciones -19 también sería lo mismo que rotar por más uno. value = value% length: significa si el valor positivo es mayor que la longitud de la cadena, luego divida por la longitud de la cadena y tome el resto. El resultado sería el mismo que si lo hiciéramos por el camino más largo.
Para hacer la rotación en su lugar, vamos a necesitar saltar por el valor de la rotación para intercambiar caracteres que están muy separados. Comenzamos en la posición cero, avanzamos por el valor de rotación y continuamos saltando en esa cantidad. si pasamos el final de la cadena, simplemente volvemos al principio. El problema es que si el valor es un número par, terminaremos justo donde comenzamos y perderemos todos los caracteres impares. La variable index0 está ahí para indicar de dónde empezamos. Si terminamos de nuevo en este índice, tenemos que avanzar en una posición de índice y seguir saltando. Continuamos haciendo esto hasta que todos los caracteres se intercambien En este punto necesitamos dos variables temporales para realizar el intercambio en su lugar. J es la posición inicial. Movemos el personaje en el índice J a la primera variable temporal. Ahora hacemos un bucle I a la longitud de la cadena. K es el índice de destino, J más el valor de rotación Envuelto alrededor del final si es necesario. Mueva el carácter en el índice K a la segunda variable temporal. Coloque el carácter del índice J en el índice K usando la primera variable temporal. Por cierto, la razón por la que no solo movemos al personaje directamente del índice J al índice K es debido a la última parte del ciclo, los índices pueden cambiar entre bucles, pero los caracteres en temp1 no deberían moverse. Ahora intercambiamos temp1 con temp2. Esta última parte es para donde el valor es un número par y estamos de vuelta donde comenzamos. Esto sucederá por el valor de rotación menos uno. incremente el índice J en uno y restablezca los valores iniciales. Bucle hasta que esté hecho.
Un video de demostración se puede encontrar aquí: https://www.youtube.com/watch?v=TMzaO2WzR24
solo disponible para sgi stl – Schildmeijer
sección 25.2.10 en el estándar C++ especifica std :: rotate –
Por cierto, si necesita un giro a la derecha, use los iteradores inversos: std :: rotate (s.rbegin(), s.rbegin() + 1, s.rend()); y la cadena se vuelve "eabcd" –