《程序员编程艺术》笔记—左旋转字符串

来源:互联网 发布:java聊天源代码 编辑:程序博客网 时间:2024/05/19 20:46

今天开始看《程序员编程艺术》,每一章都围绕一个topic进行分析并提出多种解决思路,讲解的很详细也很透彻,的确是一本学习算法的好书,推荐学习!


题目描述:

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

分析:

这里K是一个非负整数,当K为负整数时,相当于右移-K位,所以左移和右移本质是一样的。另外K可能是一个大于n的整数,不难发现字符移动n位后会回到原位置,所以左移K位实际上可以转化成左移K%N位。

方法一:

最一般的算法是考虑每次将字符串中的字符左移一位,循环K次。 但此算法时间复杂度为O(n*n), 未能达到题目要求的线性复杂度。

实现如下:

void leftRotateString(char *src, int K){if (NULL == src)return;int len = strlen(src);int K1 = K >= len ? K%len : K; char* head = src;char* tail = src + len - 1;while(K1--){char* p = head;char first = *head;int count = len - 1;while(count--){*p = *(p+1);p++;}*tail = first;}return;}


方法二:

记得以前有碰到字符串翻转的问题,如abc def翻转后变成def abc,解决的思路是以空格分隔,将其分隔成abc,def两部分,将每部分先做反转,得到 cba fed, 然后整体做一次反转即可得到def abc. 本问题可采用类似的原理,将abcdef左旋转三位变成defabc,其实类似于abc def翻转问题,那么问题就迎刃而解了。时间复杂度为O(n).

实现如下:

void reverse(char *head, char *tail){if (NULL == head || NULL == tail)return;char tmp;while(head < tail){tmp = *head;*head = *tail;*tail = tmp;head ++;tail --;}return; }void leftRotateString(char *src, int K){if (NULL == src)return;int len = strlen(src);int K1 = K >= len ? K%len : K;if (0 == K1)return;reverse(src, src + (K1 - 1));reverse(src + K1, src + (len - 1));reverse(src, src + (len - 1));}

未完待续。。。





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在厂里借工具丢了怎么办 导出的考勤没有姓名怎么办 退休时档案丢了怎么办 职工与企业没有劳资怎么办 去大学报道的档案袋丢失怎么办 档案入学毕业年份写错怎么办 从事业单位辞职后人事档案怎么办 老师辞职不给批怎么办 公办教师去私立学校档案怎么办 辞职后档案不给怎么办 档案不小心拆了怎么办 退休职工档案年龄有涂改怎么办 养老金原始档案找不到怎么办退休 寄辞职信不接收怎么办 公司不给办离职怎么办 离职手续表填写错误怎么办 退货少退了个配件怎么办 小米8拖影严重怎么办 被兼职中介骗了怎么办 被兼职中介坑了怎么办 人在工厂宿舍死了怎么办 事业单位在编人员开除后社保怎么办 因违规无法进群怎么办 微信号违规进不了群怎么办 工作跨省调动社保怎么办 工作中看到别人违反规定应该怎么办 深户调令过期了怎么办 特岗教师满三年怎么办 特岗教师想辞职怎么办 入职一周想离职怎么办 原单位买断工龄后档案怎么办 北京国企辞职后户口怎么办 工作档案弄丢了怎么办 沈阳大集体职工工龄漏算怎么办 集体职工工龄漏算怎么办 cad打开字体是问号怎么办 cad中字体显示问号怎么办 代扣代缴个税申报逾期申报怎么办 个税申报错了怎么办 个税公司报错了怎么办 个税为0没申报怎么办