【面试题】左旋字符串

来源:互联网 发布:mac os x 10.6.8 dmg 编辑:程序博客网 时间:2024/04/28 06:15

程序员编程艺术集锦

题目描述:

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef 左旋转2 位得到字符串cdefab。请实现字符串左旋转的函数,要求对长度为n 的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。

分析:

比如:1 2 3, 4 5 6, 7 8 左移3位,算法的过程是这样的,

第一轮:

1 2 3,4 5 6,7 8

4 2 3,7 5 6,1 8

第二轮:

4 2 3, 75 6, 18

4 5 3, 78 6, 12

第三轮:

4 5 3, 7 86, 1 2

4 5 6, 7 83, 1 2

第四轮:

3 1 2 左移1位

4 5 6, 7 8 3, 1 2

4 5 6, 7 8 1, 2 3

算法描述:string左移a位

StringLeftShift(string[0...n-1], a)

1 for i = 0 to a-1 do

2     t = string[i]

3     for j = i + a to n-1 do

4         string[j-a] = string[j]; j = j+a

5     string[j-a] = t

6 StringLeftShift(string[n-a...n-1], a - n%a)

代码

RESULT Algorithm25::StringLeftShift(char *str, int a) {int len = strlen(str);// a的范围限制在[0,len-1]assert(a >= 0);a %= len;if (a == 0) return R_SUCCEED;for (int i = 0; i < a; ++i) {char t = str[i];int j;for (j = i + a; j < len; j += a) {str[j-a] = str[j];}str[j-a] = t;}int b = len % a;if (b != 0) {StringLeftShift(str+(len-a), a-b);}return R_SUCCEED;}


0 0
原创粉丝点击