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;
}