微软面试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
三 代码
下面我给出另一种程序:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串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); }
相关文章推荐
- 微软算法100题26 左旋转字符串
- 左旋转字符串 【微软面试100题 第二十六题】
- 微软100题(26)左旋转字符串
- 左旋转字符串 【微软面试100题 第二十六题】
- 左旋转字符串 【微软面试100题 第二十六题】
- 微软面试100题---左旋字符串
- 微软等公司数据结构+算法面试100题---字符串
- 微软面试100题系列---字符串的排列
- 微软等数据结构+算法面试100题(2)--给出一个函数来输出一个字符串的所有排列
- 微软等数据结构+算法面试100题(29)--在字符串中删除特定的字符
- 字符串的排列 【微软面试100题 第五十三题】
- 微软面试100题---字符串转换成整数
- 在字符串中删除特定的字符 【微软面试100题 第六十三题】
- 字符串中找出最长的数字串 【微软面试100题 第二十五题】
- 微软等数据结构+算法面试100题(29)--在字符串中删除特定的字符
- 字符串转换成整数 【微软面试100题 第二十题】
- 字符串的排列 【微软面试100题 第五十三题】
- 在字符串中删除特定的字符 【微软面试100题 第六十三题】
- 微软等数据结构+算法面试100题(17)--复制两个字符串A 和B
- 微软面试100题目之17 :在一个字符串中找到第一个只出现一次的字符。