佛山网站建设骏域网站建设专家网站制作 潍坊
目录
一、题目思路
二、相关算法题目
三、总结
一、题目思路
额外新建一个数组空间:比较简单,先将后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.如果是左旋转字符串也是相同道理,先整体后局部,只不过局部反转的区间不同;