《程序员编程艺术》笔记—左旋转字符串
来源:互联网 发布: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
- 《程序员编程艺术》笔记—左旋转字符串
- 程序员编程艺术:第一章、左旋转字符串
- 【程序员编程艺术】字符串左旋转
- 程序员编程艺术第一章、左旋转字符串
- 程序员编程艺术第一章、左旋转字符串
- 程序员编程艺术:第一章、左旋转字符串
- 程序员编程艺术:第一章、左旋转字符串
- 程序员编程艺术1:左旋转字符串
- 程序员编程艺术----1、左旋转字符串
- 【程序员编程艺术】第一章:左旋转字符串
- 程序员编程艺术(算法卷):第一章、左旋转字符串
- 程序员编程艺术(算法卷):第一章、左旋转字符串
- 程序员编程艺术(算法卷):第一章、左旋转字符串
- 程序员编程艺术_第一章左旋转字符串_C实现
- 程序员编程技术学习笔记——左旋转字符串
- 程序员编程艺术学习笔记(一)字符串左旋问题
- 程序员编程艺术(算法卷):第一章、左旋转字符串探讨
- 【程序员编程艺术】学习记录1:左旋转字符串之指针翻转法
- 10条建议极大提高PHP代码的性能
- python2
- UIUC同学Jia-Bin Huang收集的计算机视觉代码合集
- TOJ 1588 Cornfields -- 二维RMQ
- 提交时提示错误This Bundle is invalid.New apps and app updates submitted to the App Store must be built wit
- 《程序员编程艺术》笔记—左旋转字符串
- [Cocos2d-x v3.x]Mac OX 创建新的Cocos2d-x 3.0 项目
- nbmvbxcjhfvesfteiotigfpoweughsdhfjashfjkajkfjklsdg
- 1032.ZOJ
- 湖南省第九届大学生程序设计竞赛
- 【线性表】链式存储结构之:双链表
- 复数运算
- Ubuntu下用arm-none-linux-gnueabi交叉编译libxml2
- OCP 1Z0 051 45