核心代码摘录自《编程之法——面试和算法心得》一书,侵删。
本文目的只是做记录,记录心得与代码,便于以后测试使用。
文章目录
字符串的旋转
题目描述:
给定一个字符串,要求将字符串前面的若干个字符,移动到字符串的尾部。
示例:
原始字符串:abcdef
移动几个字符?3
打印结果:defabc
个人分析:此问题,虽然明确指明是字符串的旋转,其实本意是字符数组的旋转。
测试代码
public static void main(String[] args) {
System.out.println("给定一个字符串,要求将字符串前面的若干个字符,移动到字符串的尾部。");
System.out.print("原始字符串:");
char[] s = StdIn.readString().toCharArray();
System.out.print("移动几个字符?");
int m = StdIn.readInt();
if(!(0 < m) || !(m < s.length) ) {
return ;
}
LeftRotateString(s, s.length, m);
System.out.printf("打印结果:%s", String.valueOf(s));
}
方案一:蛮力移位
// 蛮力移位
public static void leftShiftOne(char[] s, int n) {
// n 是数组长度
char first = s[0];
for(int i = 1; i < n; i++) {
s[i-1] = s[i];
}
s[n-1] = first;
}
public static void leftRotateString(char[] s, int n, int m) {
while(m--!=0) {
leftShiftOne(s, n);
}
// 时间复杂度 O(nm),空间复杂度O(1)
}
方案二:参考substring
public static void LeftRotateString3(char[] s, int n, int m) {
char[] tmp = new char[m];
for(