题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”
思路1
直接采用string拼接函数
巧妙拼接:拼接两段s,从n开始剪切s.size()长度的字符串
class Solution {
public:
string reverseLeftWords(string s, int n) {
if(s.size() <= n) return s;
//拼接两段s,从n开始剪切s.size()长度的字符串
return (s+s).substr(n,s.size());
}
};
思路2
遍历
和巧妙拼接的共同巧妙之处:取余遍历。
//利用取余符号,循环遍历若干个s,共取到s.size()个字符进行拼接
//
class Solution {
public:
string reverseLeftWords(string s, int n) {
if(s.size() <= n) return s;
int i = n; //字符串指针
string reStr = "";
//利用取余符号,循环遍历若干个s,共取到s.size()个字符进行拼接
for(int length = s.size();length;--length)
{
//reStr[i - n] = s[i % s.size()] ;//为什么这样写reStr会出现奇怪后缀?会自行开辟一部分不固定长空间?
reStr += s[i % s.size()];
i++;
}
return reStr;
}
};
每轮遍历拼接字符时,都需要新建一个字符串,效率较低,但取余得以循环遍历s,思路值得借鉴。
思路3
原地反转
假如给出示例输入s=[a, b, c, d, e, f, g], k=2,处理方法如下:
1.将字符串下标0到下标k-1的字符串翻转,比如ab翻转成ba
2.将字符串下标k到s.size()-1的字符串翻转,比如cdefg翻转成gfedc
3.将字符串下标0到s.size()-1的字符串翻转,比如bagfedc翻转成cdefgab,即结果
static void reverse( char a[], int left, int right ) {
int temp = 0;
while( left < right ) {
temp = a[left];
a[left++] = a[right];
a[right--] = temp;
}
}
char *reverseLeftWords( char *s, int n ) {
int len = strlen( s );
reverse( s, 0, n - 1 );
reverse( s, n, len - 1 );
reverse( s, 0, len - 1 );
return s;
}