左旋转字符串
来源:互联网 发布:数据库的接口 编辑:程序博客网 时间: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>
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"
);
}
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 26.左旋转字符串
- 第一章、左旋转字符串
- 字符串的左旋转
- 第一章、左旋转字符串
- 第一章、左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 26、左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 左旋转字符串
- 数组分隔
- 位图算法
- String类比较大小
- 外部表管理
- C语言编程中读取文件中的数据
- 左旋转字符串
- 敏捷的度量指标
- 程序员放松的8个好网站推荐
- 求子数组的最大和【DP】
- C语言try catch 异常检测实现
- C语言库函数——之一
- Oracle 索引 详解
- c++继承实例(转载)
- Java 在 Oracle BPM 中的用武之地