第二十六题(字符串左旋)

来源:互联网 发布:应用宝 软件著作权 编辑:程序博客网 时间:2024/04/30 10:55

26.左旋转字符串
题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef 左旋转2 位得到字符串cdefab。请实现字符串左旋转的函数。
要求时间对长度为n 的字符串操作的复杂度为O(n),辅助内存为O(1)。


解答:

采用先局部翻转再整体翻转的方法,例如:字符串abcdef,左旋两位:

先对ab,和cdef做局部翻转得到bafedc 

再对bafedc做整体翻转得到cdefab

代码:

#include "stdafx.h"#include<iostream>using namespace std;namespace MS100P_26{//先分别翻转字符串ab,cdef,再整体翻转void leftShift1(char *s, int n){int length = strlen(s);int temp;for (int i = 0; i < n/2; i++)//局部翻转1{temp = s[i];s[i] = s[n - i - 1];s[n - i - 1] = temp;}for (int i = n; i < n+(length-n)/2; i++)//局部翻转2{temp = s[i];s[i] = s[length-i+n-1];s[length - i + n - 1] = temp;} for (int i = 0; i < length/2; i++)//整体翻转{temp = s[i];s[i] = s[length - i - 1];s[length - i - 1] = temp;}}void test(){char str[] = "abcdef";cout << str << endl;leftShift1(str, 3);cout << str << endl;}}int _tmain(int argc, _TCHAR* argv[]){MS100P_26::test();return 0;}


0 0