题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字
符串 abcdef 左旋转 2 位得到字符串 cdefab。请实现字符串左旋转的函数。要求时间对长度
为 n 的字符串操作的复杂度为 O(n),辅助内存为 O(1)。
源码:
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <assert.h>
#include <iostream>
using namespace std;
char* ReverseString(char* start, char *end);
char* LeftRotateString(char *src,int n)
{
if (src == NULL)
{
return NULL;
}
int len = strlen(src);
n = n%len;
/*if (n == 0 || len == 1)
{
return src;
}*/
char* result = src;
char* p1Start = src;
char* p1End = src + n - 1;
char* p2Start = src + n;
char* p2End = src + len - 1;
ReverseString(p1Start, p1End);
cout << endl << " 一次反转结果" << result << endl;
ReverseString(p2Start, p2End);
cout << endl << " 二次反转结果" << result << endl;
ReverseString(src, src + len - 1);
cout << endl << " 三次反转结果" << result << endl;
return result;
}
char* ReverseString(char* start, char *end)
{
assert(start != NULL && end != NULL);
char* sstart = start;
char* eend = end;
char temp;
while (sstart<eend)
{
temp = *sstart;
*sstart = *eend;
*eend = temp;
sstart++;
eend--;
}
return start;
}
int main(void)
{
while (true)
{
char *str = (char *)malloc(100 * sizeof(char));
cout << "请输入测试串:" << endl;
cin >> str;
cout << "原串:" << endl;
cout << str << " 长度为" << (int)strlen(str) << endl;
int n;
cout << "输入左转位数 :" << endl;
cin >> n;
cout << endl;
cout << "左转结果:" << LeftRotateString(str,n) << endl;
}
return 0;
}