代码随想录刷题day25|(字符串篇)55. 右旋字符串
目录
一、题目思路
二、相关算法题目
三、总结
一、题目思路
额外新建一个数组空间:比较简单,先将后k个字符存入新数组的前k个位置,再遍历旧数组剩余length - k个字符,存入新数组的后 length - k个位置;
在原字符串上操作:1.字符串整体反转: g f e d c b a
2.反转前k个字符: f g e d c b a
3.反转后(length - k)个字符:f g a b c d e
也可以局部反转(先2.3)后再整体反转(1)
二、相关算法题目
55. 右旋字符串
55. 右旋字符串(第八期模拟笔试) (kamacoder.com)
空间复杂度O(n)解法:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
String s = sc.next();
char[] chars = s.toCharArray();
char[] newChars = new char[chars.length];
for(int i = chars.length - k, j = 0;i < chars.length;i++){
newChars[j++] = chars[i];
}
for(int j = k, i = 0;j < newChars.length;j++){
newChars[j] = chars[i++];
}
System.out.println (new String(newChars));
}
}
空间复杂度O(1)解法:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
String s = sc.next();
char[] chars = s.toCharArray();
reverse(chars, 0, chars.length - 1);
reverse(chars, 0, k - 1);
reverse(chars, k, chars.length - 1);
System.out.println (new String(chars));
}
public static void reverse(char[] chars, int left, int right){
while(left < right){
char c = chars[left];
chars[left] = chars[right];
chars[right] = c;
left++;
right--;
}
}
}
三、总结
1.字符串反转,可以使用整体反转+局部反转;
2.如果是左旋转字符串也是相同道理,先整体后局部,只不过局部反转的区间不同;