左旋转字符串
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=“abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
题解:
1)辅助队列。
利用辅助队列 ,在遍历时将字符串的前n个字符存入队列,然后将后面的字符串前移n位,然后将队列中的字符补在字符串houn位。
代码如下:
class Solution {
public:
string LeftRotateString(string str, int n) {
if(str.size()<2) return str;
queue<char> q;
for(int i=0;i<str.size();i++){
if(i<n)
q.push(str[i]);
if(n+i<str.size())
str[i]=str[n+i];
if(i>=str.size()-n){
char a=q.front();
q.pop();
str[i]=a;
}
}
return str;
}
};
2)字串法:
对n进行除length取模。
将字符串在尾部重新复制一串字符串,使得字符串中包含两串原来的字符。
获取从n开始,长度为原字符串长度的字串,即为目标字符串。
class Solution {
public:
string LeftRotateString(string str, int n) {
/*if(str.size()<2) return str;
queue<char> q;
for(int i=0;i<str.size();i++){
if(i<n)
q.push(str[i]);
if(n+i<str.size())
str[i]=str[n+i];
if(i>=str.size()-n){
char a=q.front();
q.pop();
str[i]=a;
}
}
return str;*/
int len=str.size();
if(len<2) return str;
n=n%len;
str+=str;
return str.substr(n,len);
}
};