左旋转字符串
一、题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”
限制:
1 <= k < s.length <= 10000
作者:Krahets
链接:https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/589fz2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、解题思路及代码实现
1、解题思路
1、直接使用c++string 库函数substr进行拼接,两行代码搞定
2、把字符串当成一个首尾相接的环来处理,每次把第一个字符往字符串末尾移动,然后全部字符前移一步,循环操作,直到n个字符顺利移到字符串尾部。这种方式操作简单,别说左移,右移都可以实现,只是每个字符都需要频繁移动,效率低,优点是不消耗额外内存。“\0”被当成了临时内存,存放移动的一个元素,所以不需要额外内存。
3、把n个字符当成一个整体,递归和后面的字符交换,逐步挪到尾部。这样方式,比第二种方法效率要高,并不需要频繁移动每一个元素。以下是这种实现的源码。
2、C++代码实现
class Solution {
public:
string reverseLeftWords(string s, int n) {
int length = s.length();
if (length <= 1 || n >= length) return s;
int right = length - n;
int pos_left = 0;
int pos_right = n-1;
if (right >= n) {
pos_left = 0;
pos_right = n-1;
while (pos_right + n < length) {
for (int i = 0; i < n; i++) {
char tmp = s[pos_left+i];
s[pos_left+i] = s[pos_left+i+n];
s[pos_left+i+n] = tmp;
}
pos_left += n;
pos_right += n;
}
}
if (pos_right > length) {
pos_left -= n;
pos_right -= n;
}
if (pos_right < length) {
int rest_count = length - pos_right - 1;
//处理剩余数据,剩余数据小于n
for (int i = 0; i < n; i++) {
char tmp = s[pos_right - i];
for (int j = 0; j < rest_count; j++) {
s[pos_right + j -i] = s[pos_right + 1 + j - i];
}
s[length - i - 1] = tmp;
}
}
return s;
}
};
三、提交结果
总结
从提交结果看,效率挺低的,但内存占用方面表现还不错。如果注重效率,内存占用可以松一点,直接使用拼接的方法执行效率更快。