Sword hace referencia a offer-58_2. Código y análisis de cadenas de rotación a la izquierda [Java]
1. Título
Hay una instrucción de cambio en lenguaje ensamblador llamada Rotate Left (ROL) Ahora hay una tarea simple, que es simular el resultado de esta instrucción con una cadena. Para una secuencia de caracteres dada S, genere la secuencia después de desplazarla circularmente K bits a la izquierda. Por ejemplo, la secuencia de caracteres S = "abcXYZdef", es necesaria para generar el resultado del desplazamiento circular a la izquierda en 3 bits, es decir, "XYZdefabc". ¿No es sencillo? OK, ¡hazlo!
Dos, análisis y código
1. Dos volteretas
(1) Pensando
Similar a la idea de "58. Invertir la secuencia de palabras", primero voltee los primeros k bits y otras partes de la cadena respectivamente, y luego invierta la cadena completa dos veces para lograr el objetivo.
(2) Código
public class Solution {
public String LeftRotateString(String str,int n) {
if (str.length() == 0 || n <= 0)
return str;
String ans = ReverseStr(str, 0, n - 1) + ReverseStr(str, n, str.length() - 1);
return ReverseStr(ans, 0, str.length() - 1);
}
public String ReverseStr(String str, int l, int r) {
String revStr = new String();
for (int i = r; i >= l; i--)
revStr = revStr.concat(String.valueOf(str.charAt(i)));
return revStr;
}
}
(3) Resultados
Tiempo de ejecución: 23ms, memoria ocupada: 9492k.
2. Empalme directo
(1) Pensando
Si se permite el espacio auxiliar, simplemente empalme la cuerda original directamente.
(2) Código
public class Solution {
public String LeftRotateString(String str,int n) {
if (str.length() == 0 || n <= 0)
return str;
return str.substring(n) + str.substring(0, n);
}
}
(3) Resultados
Tiempo de ejecución: 19ms, memoria ocupada: 9680k.
Tres, otro
Nada.