题目
https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/
思路一
public String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder();
char[] c = s.toCharArray();
int end = c.length-1;
int i =n;
//1.存
while (i<=end){
sb.append(c[i]);
i++;
}
//2.后移
while(1<=n){
c[end] = c[n-1];
end--;n--;
}
//3.装入
int j = 0;
while(j<=end){
c[j] = sb.charAt(j) ;
j++;
}
return String.valueOf(c);
}
但事实上我们完全可以两步解决,存入后,直接讲前面的再次存入
public String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder();
char[] c = s.toCharArray();
int end = c.length-1;
int i =n;
//1.存
while (i<=end){
sb.append(c[i]);
i++;
}
//2.将前面的存入,从0到n-1
int j = 0;
while(j<n){
sb.append(c[j]);
j++;
}
return sb.toString();
}
思路二-不申请额外空间
为了让本题更有意义,提升一下本题难度:不能申请额外空间,只能在本串上操作。
通过局部反转+整体反转 达到左旋转的目的。
和上一篇文章中翻转字符串里的单词是一样的。
具体步骤为:
反转区间为前n的子串
反转区间为n到末尾的子串
反转整个字符串
public String reverseLeftWords(String s, int n) {
StringBuilder sb=new StringBuilder(s);
//1.反转区间为前n的子串
reverse(sb,0,n-1);
//2.反转区间为n到末尾的子串
reverse(sb,n,sb.length()-1);
//3.反转整个字符串
reverse(sb,0,sb.length()-1);
return sb.toString();
}
public static void reverse(StringBuilder sb, int start, int end){
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
}