剑指offer—左旋转字符串
2016-05-20 17:12
381 查看
题目:字符串的左旋转操作时把字符串前面的若干个字符转移到字符串尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串“abcdefg”和数字2,该函数将返回左旋转2位得到结果“cdefgab”
对于这一道题,按照普通的思想我们的想法一般都是先把字符a取出来,然后把后面你的字符串向前移动,然后把a放到最后。然后依次再把b进行一次,就可以了。
代码:
上述程序就可以达到我们所要求的了,但是,其实有一种更为优化的方式可以来做这个,在这里我们把这个称为三步反转法
上面就是一种最快实现字符串左旋转操作的方法,接下来我们也来看一下右旋转操作的方法,类似依然使用三步旋转法。
对于这一道题,按照普通的思想我们的想法一般都是先把字符a取出来,然后把后面你的字符串向前移动,然后把a放到最后。然后依次再把b进行一次,就可以了。
代码:
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> void revolve_left(char str[], int k) { assert(str); int len = strlen(str);//求得字符串的长度 char tmp = 0;//用来保存你要移位的字符 if (k < len) { for (int i = 0; i < k; i++) { tmp = str[0]; for (int j = 0; j < len - 1; j++) { str[j] = str[j + 1];//对后面的字符串向前移位, } str[len - 1] = tmp;//把第一个字符放到最后的位置 } } else { exit(1); } } int main() { char str[] = "abcdefg"; int k = 0; printf("输入你所需要旋转的字符个数:"); scanf("%d", &k); revolve_left(str, k); printf("%s\n", str); system("pause"); return 0; }
上述程序就可以达到我们所要求的了,但是,其实有一种更为优化的方式可以来做这个,在这里我们把这个称为三步反转法
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> void reverse(char *left,char *right) { while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } void revolve_left(char *str, int k) { int len = strlen(str); assert(str); if (k<len&&k>0 && len > 0) { reverse(str, str + k - 1);//第一步反转前一部分 reverse(str + k, str + len - 1);//第二步反转第二部分 reverse(str, str + len - 1);//第三步反转整体 } } int main() { char str[] = "abcdefg"; int k = 0; printf("输入你所需要旋转的字符个数:"); scanf("%d", &k); revolve_left(str, k); printf("%s\n", str); system("pause"); return 0; }
上面就是一种最快实现字符串左旋转操作的方法,接下来我们也来看一下右旋转操作的方法,类似依然使用三步旋转法。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h> void reverse(char *p, char *q) { while (p < q) { char tmp = *p; *p = *q; *q = tmp; p++; q--; } } void RightLoopMove(char *pStr, unsigned short steps) { int len = strlen(pStr); assert(pStr); reverse(pStr + len - steps, pStr + len-1); reverse(pStr, pStr + len - steps-1); reverse(pStr , pStr + len-1); } int main() { char str[] = "abcdefg"; RightLoopMove(str, 2); printf("%s\n", str); system("pause"); return 0; }
相关文章推荐
- 用JavaScript动态建立或增加CSS样式表的实现方法
- 用jQuery写扩展插件实现语音播报
- 剑指Offer——圆圈中最后剩下的数字
- <Js>数据类型
- CSS——display显示属性
- js抛物线
- Web前端程序员推荐7个实用的JavaScript工具
- js判断单选按钮是否被选中
- HTML5新标签在IE6/IE7/IE8中的几种兼容方式
- NW.js & Electron Compared (2016 Edition)
- 详解JavaScript中的事件流和事件处理程序
- bootstrap模态框配置
- CSS自适应布局总结
- json一些特点
- QPushButton 的样式表代码
- struts2+jquery+json集成
- js跨域请求
- 50个必备的实用jQuery代码段
- 一句命令快速合并 JS、CSS
- js简单分页,可用