[置顶] 循环右移字符串简易探讨

#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();
}


测试:

 



 

posted @ 2013-08-17 22:40  pangbangb  阅读(263)  评论(0编辑  收藏  举报