题意
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
解法1—字符串遍历
class Solution
{
public:
string reverseLeftWords(string s, int n)
{
if(0==s.size())
return s;
n=n%s.size();
if(0==n)
return s;
string res;
for(int i=0;i<s.size();++i)
res+=s[(i+n)%s.size()];
return res;
}
};
解法2— 字符串切分与拼接
class Solution
{
public:
string reverseLeftWords(string s, int n)
{
if(0==s.size())
return s;
n=n%s.size();
if(0==n)
return s;
string res;
/*
for(int i=0;i<s.size();++i)
res+=s[(i+n)%s.size()];
*/
string tmp=s.substr(0,n);
res=s.substr(n,s.size()-n)+tmp;
return res;
}
};
解法3—三次翻转
首先翻转str[:n]子串,其次翻转str[n:]子串,最后翻转str.
以 str = abcdefg,n=2,为例
第一次翻转前面部分的"ab",翻转后成为 "ba"
第二次翻转后面部分的"cdefg',翻转后成为"gfedc"
这样整个字符串成为:"bagfedc"。
再翻转整个字符串:“cdefgab”。
class Solution
{
public:
string reverseLeftWords(string s, int n)
{
if(0==s.size())
return s;
n=n%s.size();
if(0==n)
return s;
string res;
/*
for(int i=0;i<s.size();++i)
res+=s[(i+n)%s.size()];
*/
/*
string tmp=s.substr(0,n);
res=s.substr(n,s.size()-n)+tmp;
return res;
*/
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
reverse(s.begin(),s.end());
return s;
}
};