您的位置:首页 > 职场人生

微软面试100题之26题:左旋转字符串

2014-04-18 10:42 225 查看
一 题目:

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。

如把字符串abcdef 左旋转2 位得到字符串cdefab。请实现字符串左旋转的函数。

要求时间对长度为n 的字符串操作的复杂度为O(n),辅助内存为O(1)。

二 解题思路

定义一种字符串转置操作XT--将字符串反转可以验证(XT)T=X (XY)T=YTXT 原有字符串为XY,左移后的字符串应该是YX 那么有(XTYT)T=(YT)T(XT)T=YX

三 代码

/*
This is a free Program, You can modify or redistribute it under the terms of GNU
*Description:字符串转置的应用--
*定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字
*符串abcdef 左旋转2 位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度
*为n 的字符串操作的复杂度为O(n),辅助内存为O(1)。

*Language: C++
*Development Environment: VC6.0
*Author: Wangzhicheng
*E-mail: 2363702560@qq.com
*Date: 2012/12/6
*/

/*
定义一种字符串转置操作XT--将字符串反转
可以验证(XT)T=X (XY)T=YTXT
原有字符串为XY,左移后的字符串应该是YX
那么有(XTYT)T=(YT)T(XT)T=YX
*/
#include <iostream>
#include <cstdlib>
#include <string>
#include <algorithm>

using namespace std;

class Solution {
private:
string str;
void Reverse(string::iterator beg,string::iterator end) {
while(beg!=end) {
swap(*beg++,*--end);
}
}
public:
Solution(const string &input) {
str=input;
}
void JustDoIt(int n) {
if(n<0) {
cerr<<"参数有误!"<<endl;
exit(1);
}
if(n>str.size()) n-str.size();
Reverse(str.begin(),str.begin()+n);  //XT
Reverse(str.begin()+n,str.end());    //YT
Reverse(str.begin(),str.end());      //(XTYT)T
}
void show() {
cout<<"左旋后的字符串是:"<<str<<endl;
}
};

void main() {
Solution s("Hello world, I am wangzhicheng");
s.JustDoIt(2);
s.show();
}


下面我给出另一种程序:

#include <iostream>
#include <algorithm>
using namespace std;

void reverse(char* str, int begin, int end)
{
int i = 0;
while(i <= (end - begin) / 2)
{
swap(str[begin + i],str[end - i]);
++i;
}
}

/*
*len为字符串长度
*pivot为左移的字符串个数
*算法的思想是先对pivot左边的一部分字符串翻转,再对右边的一部分翻转
*最后对所有字符串翻转一次就行
*/
void rorate(char* str, int len, int pivot)
{
reverse(str,0,pivot - 1);
reverse(str, pivot, len - 1);
reverse(str, 0, len - 1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: