题目描述:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
限制:
- 1 <= k < s.length <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
题目分析:
这个题我用了两种做法:
第一种:利用string的substr()字符串截取函数
- 首先用一个字符串tmp赋值为s+s,就是原字符串的首尾拼接后的新字符串。
- 红色箭头指向的是截取后字符串的起始位置,绿色箭头指向的是截取后字符串的结束位置。
- s.substr(起始位置,截取长度),下标从0开始,所以对应给的n就是起始下标,原始字符串的长度就是要截取的长度。
ac代码:
class Solution {
public:
string reverseLeftWords(string s, int n) {
string tmp=s+s;
int len=s.size();
return tmp.substr(n,len);
}
};
第二种:
- 可以看作从n开始遍历,然后遍历到n-1,可以看作一个回路。
- 用一个空字符串接收,从下标n开始遍历,用一个变量num控制遍历的总个数,直至遍历到字符串长度为止。
- 如何控制形成回路遍历?用长度控制,n%=s.size()。
class Solution {
public:
string reverseLeftWords(string s, int n) {
string tmp="";
int num=0;
int len=s.size();
while(num!=len)
{
tmp+=s[n];
n++;
num++;
n%=len;
}
return tmp;
}
};
使用字符串函数截取在速度上还是慢很多,还是手写循环快一些。