欢迎大家来论坛 http://jobexam.net
【题目】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
【输入】输入一个字符串,和左旋转的位数【输出】输出旋转后的字符串
【例子】abcdef,左旋转2位,则输出cdefab
【解析】假设函数为 char *leftRotate(char * str, int length, int n),length为字符串长度。
第一步,将字符串逆序;即first = 0 到 rear = length-1;
第二步,将前面一部分字符串逆序,即first = 0 到 rear = length - n -1;
第三步,将后面一部分字符串逆序,即first = length - n 到rear = length -1;
得到最终的结果。
代码如下:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#include <iostream>
using
namespace
std;
void
exchange(
char
* p,
char
*q)
{
char
tmp;
tmp = *p;
*p = *q;
*q = tmp;
}
char
*leftRotate(
char
* str,
int
length,
int
n)
{
if
(length < 0)
{
return
NULL;
}
int
first = 0;
int
rear = length -1;
//对str逆序
while
(first < rear)
{
exchange(&(str[first]),&(str[rear]));
first++;
rear--;
}
first = 0;
rear = length - n -1;
//对第一部分逆序
while
(first < rear)
{
exchange(&(str[first]),&(str[rear]));
first++;
rear--;
}
first = length - n;
rear = length - 1;
//对第二部分逆序
while
(first < rear)
{
exchange(&(str[first]),&(str[rear]));
first++;
rear--;
}
return
str;
}
int
main(
char
** argv,
int
argc)
{
char
str[7] =
"abcdef"
;
int
n= 2;
cout << leftRotate(str,6,2) << endl;
system
(
"PAUSE"
);
}
|