旋转字符串的三种算法
2016-03-03 19:52
351 查看
题目:给定一个长度为n的字符串,将它向左旋转i个位置,例如,str = "abcdefg", n = 7, i = 3,则旋转后,str = "defgabc",要求空间复杂度为1。 一般,解旋转字符串这样的题目,最简单的做法即是先将前i个字符拷贝到临时空间,然后将后n - i个字符前移,最后再将临时空间中的数据拷贝到原字符串的后i个位置上。但这样做会额外浪费i个空间。现给出如下三种算法: • 算法一: void swap(char* str, int n, int ){ int j; for (j = 0; j < i; ++j) { int t = str[j]; str[j] = str[n - i + j]; str[n - i + j] = t; } } void rotate(char* str, int n, int i) { if (0 == i || n == i) return; int k = n - i; if (i < k) { swap(str, n, i); rotate(str, n - i, i); } else { swap(str, n, k); rotate(str + k, n - k, i - k); } }算法二: void reverse(char*str, int n) { int m = n / 2; int i; for (i = 0; i < m; ++i) { int t = str[i]; str[i] = str[ n - 1 - i]; str[n - 1 - i] = t; } } void rotate(char* str, int n, int i) { reverse(str, i); reverse(str + i, n - i); reverse(str, n); } 算法三: int gcd(int m, int n) { int k = m % n; if (0 == k) return n; else return gcd(n, k); } void rotate(char* str, int n, int i) { int k = gcd(n, i); int init; for (init = 0; init < k; ++init) { int cur = init; char t = str[cur]; int next; for (next = (cur + i) % n; next != init; next = (cur + i) % n) { str[cur] = str[next]; cur = next; } str[cur] = t; } } 不难看出,这三种算法的空间复杂度都是1,而时间复杂度都是n。但,算法三实际上更加巧妙,它所用时间只是前两者的一半。 |
相关文章推荐
- 镜像二叉树
- iOS使用NSMutableAttributedString 实现富文本(不同颜色字体、下划线等)
- Quarta介绍
- Intellij IDEA快捷键与使用技巧
- uva 11800 基础几何的图形判断
- leetcode之Partition List
- Intellij IDEA快捷键与使用技巧
- Codeforces Round #201 (Div. 2) - C. Alice and Bob
- windows expect-5.21r1b1-setup.exe 下载链接
- 第一周作业
- 浏览器缓存机制
- BZOJ 2400(网络流最小割)
- Spark , JAVA_HOME is not set
- ProcessBuilder中如何为命令行传参
- 对于大流量的网站,采用什么样的方法解决访问量问题
- BZOJ4409: [Usaco2016 Feb]Circular barn
- Java保留小数点后数字位数
- mysql中null与not null的区别及效率
- 划分树 poj2104 hdu5249
- moon 。 XML第二章