左旋转字符串

来源:互联网 发布:数据库的接口 编辑:程序博客网 时间:2024/04/29 17:53

欢迎大家来论坛 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>
usingnamespace std;
voidexchange(char* p, char*q)
{
        chartmp;
        tmp = *p;
        *p = *q;
        *q = tmp;
}
 
char*leftRotate(char* str, intlength, intn)
{
        if(length < 0)
        {
                returnNULL;
        }
 
        intfirst = 0;
        intrear = 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--;
        }
        returnstr;
}
intmain(char** argv, intargc)
{
        charstr[7] = "abcdef";
        intn= 2;
        cout << leftRotate(str,6,2) << endl;
        system("PAUSE");
}
原创粉丝点击