难度简单186收藏分享切换为英文接收动态反馈
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2 输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6 输出: "umghlrlose"
限制:
1 <= k < s.length <= 10000
可以使用两种方法1.暴力破解时间复杂度O(n2)代码如下:
class Solution {
public String reverseLeftWords(String s, int n) {
char[] chars = s.toCharArray();
int len = chars.length;
//如果n等于数组长度,就返回原字符串
if (n==len){
return new String(chars);
}
//如果n小于数组长度,就将字符移动到字符串末尾
if (n<len){
for (int i=0;i<n;i++){
for (int j=0;j<len-1;j++){
char temp = chars[j];
chars[j] = chars[j+1];
chars[j+1] =temp;
}
}
}
return new String(chars);
}
}
2.可以使用局部反转后再全体反转,时间复杂度O(n),空间复杂度O(1),实现代码如下:
class Solution {
public String reverseLeftWords(String s, int n) {
/*1.可以通过先局部反转
2.反转n剩余的区间
3.最后反转整个字符串
*/
StringBuilder sb = new StringBuilder(s);
int len = s.length()-1;
reverseString(sb,0,n-1);
reverseString(sb,n,len);
return sb.reverse().toString();//调用StringBuilder的库函数reverse实现整个反转
}
//编写一个方法能够实现局部反转
public static void reverseString(StringBuilder s,int start,int end){
while (start<end){
char temp = s.charAt(start);
s.setCharAt(start,s.charAt(end));
s.setCharAt(end,temp);
start++;
end--;
}
}