Appearance
58-II-左旋转字符串
题目描述
https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
限制:
1 <= k < s.length <= 10000
思路1:新数组
写一个函数用来单独旋转字符串。 然后将 0~i 旋转 i+1~n-1 旋转,最后旋转整个字符串。
csharp
public class Solution {
public string ReverseLeftWords(string s, int n) {
//create result array
char[] resultArr = new char[s.Length];
int charIndex = 0;
//fill second part
for(int i=n;i<s.Length;i++){
resultArr[charIndex] = s[i];
charIndex++;
}
//fill first part
for(int i=0;i<n;i++){
resultArr[charIndex] = s[i];
charIndex++;
}
return new string(resultArr);
}
}
思路2:3次反转
abcdefg,k=2 ,先把 前两位翻转为 ba 后面反转为 gfedc ,然后将整体一起反转 cdefgab
csharp
public class Solution {
public string ReverseLeftWords(string s, int n) {
char[] arr = s.ToCharArray();
reverse(arr,0,n);
reverse(arr,n,s.Length);
reverse(arr,0,s.Length);
return new string(arr);
}
//注意替换第二段下标值的时候 arr[i] = arr[end + start -i -1];
private void reverse(char[] arr, int start, int end){
for(int i=start;i < (end+start)/2;i++){
char tmp = arr[i];
arr[i]=arr[end+start-i-1];
arr[end+start-i-1]=tmp;
}
}
}
AlgoPress