题目
【汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”】
方法一
1、分析
- 对于字符串的左移,可以看成字符串的多次翻转的结果。如题中的字符串左移3位,可以先将字符串分成两部分: abcXYZdef 。先对前一部分进行翻转为cba,再对后一部分进行翻转为 fedZYX。最后再整体的对翻转后的字符串(cbafedZYX)翻转一次,即为所求的结果:XYZdefabc
2、代码
class Solution {
public:
string reverseLeftWords(string s, int n) {
int len=s.length();
if(len<=0||n>len||n<0) return "";
int firstStart=0, firstEnd=n-1;
int secondStart=n,secondEnd=len-1;
ReverseWord(s,firstStart,firstEnd);
ReverseWord(s,secondStart,secondEnd);
ReverseWord(s,firstStart,secondEnd);
return s;
}
void ReverseWord(string &str,int start, int end)
{
while(start<end)
{
swap(str[start++],str[end--]);
}
}
};
方法二、利用string的函数更加简洁
class Solution {
public:
string reverseLeftWords(string s, int n) {
string str;
int len=s.size();
if(len<=0||n>len||n<0) return str;
str=s.substr(n); //下标n开始的后部分子串
str+=s.substr(0,n); //s的前n个字符
return str;
}
};