代码改变世界

算法100题26

2011-09-19 00:16  justvi  阅读(845)  评论(2编辑  收藏  举报

/* 题目来自:http://blog.csdn.net/v_JULY_v

 * 题26:定义字符串的左旋转操作:把字符串前面若干个字符移动到字符串的尾部。

 * 如abcdef左旋转2位得到cdefab。

 * 方法:(可见《编程珠玑》) AB->BA: f(f(A)f(B)) = BA,f表示将字符串逆置

 * (补充)说明:将AB转换成BA,可将A逆置得到Ar,再将B逆置得到Br,再将整体ArBr逆置得到BA。

 * 如abcdef左旋2位,首先将ab逆置得到ba,再将cdef逆置得到fedc,再将整体bafedc逆置得到cdefab。

 */

 1 #include <stdio.h>
2
3 void f(char *s, int l, int u)
4 {
5 char t;
6 while (l < u)
7 {
8 t = s[l];
9 s[l] = s[u];
10 s[u] = t;
11 l++, u--;
12 }
13 }
14
15 void func(char *s, int n, int m)
16 {
17 m = m % n;
18 f(s, 0, m-1);
19 f(s, m, n-1);
20 f(s, 0, n-1);
21 }
22
23 int main()
24 {
25 char s[] = "abcdef";
26 func(s, 6, 8);
27 printf("%s\n", s);
28 return 0;
29 }

可得到:cdefab