字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。(来源力扣)
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: "umghlrlose"
方法一:通过扩大字符数组的长度将需要反转的字母拷贝到字符数组末尾,最后转为字符串,去掉前后空格。
public String reverseLeftWords(String s, int n) {
int len=s.length();
if(n<0||n>len){
return s;
}
char[] c=new char[len+n];
for(int i=0;i<len;i++){
c[i]=s.charAt(i);
}
int i=0;
while(i<n){
c[len+i]=c[i];
c[i]=0;
i++;
}
s=String.valueOf(c);
return s.trim();
}
方法二:整体反转+局部反转(两次反转就完成了左旋的目的,同时是在字符串本身进行操作的)
比如S=“abcdefghij”,要反转前4个字母,
- 整体反转:s=“jihgfe*|*dcba”(分为两部分)
- 前半部分反转,“efghij”
- 后半部分反转,“abcd”
即:S=“efghijabcd”
//空间复杂度为O(1)
public String reverseLeftWords(String s, int n) {
int len=s.length();
if(n<0||n>len){
return s;
}
//整体反转
char[] c=s.toCharArray();
int left=0;
int right=len-1;
while(left<right){
char temp;
temp=c[left];
c[left]=c[right];
c[right]=temp;
left++;
right--;
}
//前半部分局部反转
left=0;
right=len-1-n;
while(left<right){
char temp;
temp=c[left];
c[left]=c[right];
c[right]=temp;
left++;
right--;
}
//后半部分局部反转
left=len-n;
right=len-1;
while(left<right){//gfedcba
char temp;
temp=c[left];
c[left]=c[right];
c[right]=temp;
left++;
right--;
}
return String.valueOf(c);
}