题目
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
分析
这一题中的循环左移操作可以转换成三次字符串反转操作:
- 首先将整个字符串进行反转;
- 然后将前 l e n − n len-n len−n个字符组成的子串进行反转;
- 最后将后 n n n个字符组成的子串进行反转;
当然在上述操作之外还需判断字符串是否为空或者给定循环位数是否超过字符串长度。
github链接如下:JZ43-左旋转字符串
类似考研真题请移步:2010年计算机联考真题——一维数组循环左移
C++代码
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
string LeftRotateString(string str, int n) {
int len = str.length();
char* ch = (char*)str.c_str();
this->reverse(ch,0,len-1,len);
this->reverse(ch,0,len-n-1,len);
this->reverse(ch,len-n,len-1,len);
string result = "";
for(int i = 0 ; i < len ; i++){
result.push_back(ch[i]);
}
return result;
}
void reverse(char* ch,int start,int end,int len){
if(start >= end || end >= len){
return;
}
int mid = (start + end) / 2;
for(int i = 0 ; i <= mid-start ; i++){
char tmp = ch[end-i];
ch[end-i] = ch[i+start];
ch[i+start] = tmp;
}
}
};
int main()
{
string str;
int size;
Solution s;
while(cin>>size>>str){
cout<<s.LeftRotateString(str,size)<<endl;
}
return 0;
}