#include <iostream>
#include <cstdlib>
#include <string>
#include <queue>
using namespace std;
/*
*设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N)
*/
/*
* 方案一:将数组以队列存储,循环右移k位,相当于循环左移N-K位
* 对于队列而言,循环左移一位,相当于取出队头元素然后插入队尾
*/
class Solution {
private:
string str; // 源字符串,由键盘输入
string result; // 转换后的字符串
queue<char>q; // 辅助队列
public:
Solution() {
cin>>str;
string::iterator it;
/*
* 将输入字符串转换为队列
*/
for(it = str.begin();it!= str.end();it++) {
q.push(*it); // 将元素插入队尾
}
}
void JustDoIt(int k) {
int i;
char t;
int n = q.size(); // 取出队列元素个数
/*
* 参数判断
*/
if(k < 0) {
cerr<<"参数错误!"<<endl;
exit(1);
}
/*
* 当k > N时,循环右移K位,相当与循环右移K%N位
*/
k %= n;
for(i = 1;i <= n - k;i++) {
t = q.front(); // 取出对头元素
q.pop(); // 弹出对头元素(队列头部出,尾部进)
q.push(t);
}
/*
* 生成结果字符串
*/
for(i = 1;i <= n;i++) {
t = q.front();
q.pop();
result += t;
}
}
void show() const {
cout<<result<<endl;
}
};
void main() {
Solution s;
s.JustDoIt(4);
s.show();
}
#include <iostream>
#include <cstdlib>
#include <string>
#include <queue>
using namespace std;
/*
*设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N)
*/
/*
* 方案二:将数组以字符串存储,使用转置法解决
* 假设字符串为XY,Y是要循环右移的子串,移动后结果应该是YX
* 那么 (YX) = (XTYT)T
*/
class Solution {
private:
string str; // 源字符串,由键盘输入
string result; // 转换后的字符串
public:
Solution() {
cin>>str;
}
/*
* 逆转从指针i到指针j的字符串s
*/
void swap(string &s, int i, int j) {
char t;
while(i < j) {
t = s[i];
s[i] = s[j];
s[j] = t;
i++;
j--;
}
}
void JustDoIt(int k) {
int n = str.size();
/*
* 参数判断
*/
if(k < 0) {
cerr<<"参数错误!"<<endl;
exit(1);
}
/*
* 当k > N时,循环右移K位,相当与循环右移K%N位
*/
k %= n;
result = str;
swap(result, 0, n - k - 1);
swap(result, n - k, n -1);
swap(result, 0, n - 1);
}
void show() const {
cout<<result<<endl;
}
};
void main() {
Solution s;
s.JustDoIt(4);
s.show();
}
测试: