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

分析:如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置。于是我们可以新开辟一块长度为n+1的辅助空间,把原字符串后半部分拷贝到新空间的前半部分,在把原字符串的前半部分拷贝到新空间的后半部分。不难看出,这种思路的时间复杂度是O(n),需要的辅助空间也是O(n)。

接下来的一种思路可能要稍微麻烦一点。我们假设把字符串左旋转m位。于是我们先把第0个字符保存起来,把第m个字符放到第0个的位置,在把第2m个字符放到第m个的位置…依次类推,一直移动到最后一个可以移动字符,最后在把原来的第0个字符放到刚才移动的位置上。接着把第1个字符保存起来,把第m+1个元素移动到第1个位置…重复前面处理第0个字符的步骤,直到处理完前面的m个字符。

该思路还是比较容易理解,但当字符串的长度n不是m的整数倍的时候,写程序会有些麻烦,感兴趣的朋友可以自己试一下。由于下面还要介绍更好的方法,这种思路的代码我就不提供了。

我们还是把字符串看成有两段组成的,记位XY。左旋转相当于要把字符串XY变成YX。我们先在字符串上定义一种翻转的操作,就是翻转字符串中字符的先后顺序。把X翻转后记为XT。显然有(XT)T=X。

我们首先对X和Y两段分别进行翻转操作,这样就能得到XTYT。接着再对XTYT进行翻转操作,得到(XTYT)T=(YT)T(XT)T=YX。正好是我们期待的结果。

分析到这里我们再回到原来的题目。我们要做的仅仅是把字符串分成两段,第一段为前面m个字符,其余的字符分到第二段。再定义一个翻转字符串的函数,按照前面的步骤翻转三次就行了。时间复杂度和空间复杂度都合乎要求。

参考代码如下:

#include "string.h"///
// Move the first n chars in a string to its end
///
char* LeftRotateString(char* pStr, unsigned int n)
{if(pStr != NULL){int nLength = static_cast<int>(strlen(pStr));if(nLength > 0 && n > 0 && n < nLength){char* pFirstStart = pStr;char* pFirstEnd = pStr + n - 1;char* pSecondStart = pStr + n;char* pSecondEnd = pStr + nLength - 1;// reverse the first part of the stringReverseString(pFirstStart, pFirstEnd);// reverse the second part of the strintReverseString(pSecondStart, pSecondEnd);// reverse the whole stringReverseString(pFirstStart, pSecondEnd);}}return pStr;
}///
// Reverse the string between pStart and pEnd
///
void ReverseString(char* pStart, char* pEnd)
{if(pStart != NULL && pEnd != NULL){while(pStart <= pEnd){char temp = *pStart;*pStart = *pEnd;*pEnd = temp;pStart ++;pEnd --;}}
}

本文已经收录到《剑指Offer——名企面试官精讲典型编程题》一书中,有改动,书中的分析讲解更加详细,讨论了本题和“翻转句子中的单词”的联系,达到举一反三的目的。欢迎关注。

本题已被九度Online Judge系统收录,欢迎读者移步到http://ac.jobdu.com/hhtproblems.php在线测试自己的代码。

博主何海涛对本博客文章享有版权。网络转载请注明出处http://zhedahht.blog.163.com/。整理出版物请和作者联系。

程序员面试题精选100题(21)-左旋转字符串[算法]相关推荐

  1. 程序员面试题精选100题(17)-把字符串转换成整数[算法]

    题目:输入一个表示整数的字符串,把该字符串转换成整数并输出.例如输入字符串"345",则输出整数345. 分析:这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程 ...

  2. 程序员面试题精选100题(51)-顺时针打印矩阵[算法]

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如:如果输入如下矩阵: 1              2              3              4 5     ...

  3. 程序员面试题精选100题(37)-寻找丑数[算法]

    题目:我们把只包含因子 2. 3和 5的数称作丑数(Ugly Number).例如 6. 8都是丑数,但 14不是,因为它包含因子 7.习惯上我们把 1当做是第一个丑数.求按从小到大的顺序的第 150 ...

  4. 程序员面试题精选100题(40)-扑克牌的顺子[算法]

    题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字. 分析:这题目很有意思,是一个典型的寓教于 ...

  5. 程序员面试题精选100题(58)-八皇后问题[算法]

    题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行.同一列或者同一对角斜线上.下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法.请求出总共有多少种摆法 ...

  6. 程序员面试题精选100题

    程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树   ...

  7. [程序员面试题精选100题]13.第一个只出现一次的字符

    [题目] 在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b. [分析] [代码] /********************************* * 日期:2013- ...

  8. 程序员面试题精选100题(51)-顺时针打印矩阵

    // 程序员面试题精选100题(51)-顺时针打印矩阵.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostre ...

  9. 程序员面试题精选100题:求从1到n的正数中1出现的次数

    // 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...

最新文章

  1. java带参数的方法笔记_具有Java参数的方法的类声明
  2. PHP5 VC9、VC6、Thread Safe、Non Thread Safe各个版本区别
  3. Linux下修改Mysql的用户(root)的密码
  4. Android实例]------获取sd卡图片显示出来
  5. PHP 的面向方面编程
  6. OpenCV-绘制箭头cv::arrowedLine
  7. 电脑桌面出现透明条图标“复制”“刷新”解决方法
  8. Matlab中fsolve传递系数变量
  9. Js解决微信浏览器刷新的问题
  10. MT6573 android 系统默认语言处理流程
  11. Cesium加载OpenStreetMap
  12. GraphQL:你的容颜,十万光年
  13. 【WLAN】【测试】WLAN相关测试软件一览
  14. 欢乐庆团圆--记华清远见嵌入式学院老学员联谊会
  15. 怎样购买笔记本电脑-世界十大品牌
  16. 清空Qtablewiget 表格的内容
  17. panada indexing,selection,assigning
  18. A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK文章笔记
  19. js bug: Origin 'null' is therefore not allowed access.
  20. 北师大的计算机科学专业排名,2021北京师范大学王牌优势专业排名 什么专业最好...

热门文章

  1. 首份《顶级数据团队建设全景报告》重磅发布: 逾半数据团队称人才储备不足
  2. IBM在人工智能方面的新进展,理解谈话情景和感知情绪
  3. 用gdb调试core dump文件
  4. Spring5源码 - 05 invokeBeanFactoryPostProcessors 源码解读_2
  5. Shell-实际业务操作03
  6. Linux keypad 设备树,SC7731客户配置文档.pdf
  7. mysql 插入数据后返回该条数据id
  8. java越权发送邮件_已登录用户 越权 访问action方法怎么解决?
  9. 微信防撤回python代码_Python实现微信防撤回
  10. tensorflow对应的python版本_详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系