面试题42:翻转单词顺序 VS左旋转字符串
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student.a am I"。

代码如下:

void Reverse(char *pBegin, char *pEnd)
{if (pBegin == nullptr || pEnd == nullptr) return;while (pBegin < pEnd){char temp = *pBegin;*pBegin = *pEnd;*pEnd = temp;pBegin++;pEnd--;}
}char *ReverseSentence(char *pData)
{if (pData == nullptr) return nullptr;char *pBegin = pData;char *pEnd = pData;while (*pEnd != '\0') pEnd++;pEnd--;//翻转整个句子Reverse(pBegin, pEnd);//翻转句子中的每个单词pBegin = pEnd = pData;while (*pBegin != '\0'){if (*pBegin == ' '){pBegin++;pEnd++;}else if (*pEnd == ' ' || *pEnd == '\0'){Reverse(pBegin, --pEnd);pBegin = ++pEnd;}else{pEnd++;}}return pData;
}

测试用例:
● 功能测试(句子中有多个单词,句子中只有一个单词)。
● 特殊输入测试(字符串指针为 NULL 指针、字符串的内容为空、字符串中只有空格)。

题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。

代码如下:

char *LeftRotateString(char *pStr, int n)
{if (pStr != nullptr){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;//翻转字符串的前面n个字符Reverse(pFirstStart, pFirstEnd);//翻转字符串的后面部分Reverse(pSecondStart, pSecondEnd);//翻转整个字符串Reverse(pFirstStart, pSecondEnd);}}return pStr;
}

与字符串相关的代码通常要注意这两点:
一是输入空指针 NULL 时程序会崩溃;

二是内存访问越界的问题,也就是试图访问不属于字符串的内存。例如如果输入的n小于0,指针pStr+n指向的内存就不属于字符串。如果我们不排除这种情况,试图访问不属于字符串的内存就会留下严重的内存越界的安全隐患。在前面的代码中,我们添加了两个if判断语句就是为了防止出现这两种问题。

测试用例:
● 功能测试(把长度为n的字符串左旋转0个字符、1个字符、2个字符、n-1个字符、n个字符、n+1个字符)。
● 特殊输入测试(字符串的指针为NULL指针)。
本题考点:
● 考查知识迁移的能力。当面试的时候遇到第二个问题,而之前我们做过“翻转句子中单词的顺序”这个题目,那如果能够把多次翻转字符串的思路迁移过来,就能很轻易地解决字符串左旋转的问题。
● 考查对字符串的编程能力。

[剑指offer]面试题42:翻转单词顺序 VS左旋转字符串相关推荐

  1. 剑指offer面试题[42]-反转单词顺序VS左旋转字符串

    题目1: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=&quo ...

  2. 【剑指offer-Java版】42翻转单词顺序VS左旋转字符串

    反转单词顺序以及左旋转字符串:输入一个英文句子,翻转句子中的单词顺序,单词内部的字母顺序是不变的 – I am a student. -> student. am I 第一步,翻转句子中的所有字 ...

  3. 剑指 Offer 笔记: T58 - I. 翻转单词顺序

    T58 - I. 翻转单词顺序 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student. &qu ...

  4. 剑指Offer:翻转单词顺序 vs 左旋转字符串

    题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内部的顺序不变.为简单起见 ,标点符号和普通字母一样处理.例如输入字符串"I am a student. ",则输出" ...

  5. 翻转单词顺序与左旋转字符串

    题目一:输入一个英文句子,翻转句子中单词的顺序.但是单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student.",则输出" ...

  6. 翻转单词顺序和左旋转字符串

    输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理. 例如输入字符串"I am a student.",则输出"stu ...

  7. 剑指Offer——(44)翻转单词顺序列

    题目描述: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"s ...

  8. 剑指offer面试题42. 连续子数组的最大和(动态规划)

    题目描述 输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为O(n). 思路 详见链接 代码 class Solution: ...

  9. [剑指offer]面试题第[2]题[JAVA][替换空格][函数][字符串]

    [问题描述] 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. [解答 ...

最新文章

  1. 打造交叉复合型数据人才的高地:清华大学大数据能力提升项目宣讲会成功举行!...
  2. 谷歌首席科学家:搞研究的痛苦,搞工程的人不懂
  3. python 实现异常退出
  4. linux 数据复制 dd 简介
  5. 蜂鸣器接入_无源蜂鸣器的原理和和mixly结合制作电子琴
  6. 数字信号处理学习笔记(五)|有限脉冲响应数字滤波器的设计
  7. Kafka科普系列 | 轻松理解Kafka中的延时操作
  8. ANSIBLE--handlers的概念
  9. Spring IOC容器组件注入的几种方式
  10. 让微信扫描直接下载你的APK
  11. Ubuntu环境下sublime3 nodejs安装与插件配置
  12. 程序员鼓励师是什么?
  13. LInux下CAN滤波时间,linux下can调试工具canutils安装过程记录
  14. asp.net html合并table中的行高度用百分比不起作用,asp.net中多行文本框高度自适应内容的问题...
  15. [知识图谱] 1.2-知识图谱有什么用?
  16. 天正的计算机快捷命令大全,cad天正建筑快捷键命令大全(整理).doc
  17. Python读写excel练习_去除excel中乱码行,并添加列
  18. Python求解非齐次线性方程组代码
  19. pacman入门使用指南
  20. 微软中国CEO梁念坚 : Windows Phone有四大优点

热门文章

  1. Android之稍微靠谱点的透明Activity(不获取触摸事件)
  2. 贪心算法之用优先队列解决最短路径问题(Dijkstra算法)
  3. Spring AOP 本质
  4. 怎样理解Linux的文件系统
  5. mysql signed 长度_浅谈mysql字段长度设置
  6. 迅捷路由器 服务器无响应,如果路由器重启还是上不了网 几招搞定
  7. 物理学上最厉害的54个男人!2400年来难以超越,没想到聚在一起后这么震撼......
  8. 这6个动作,据说只有20%的人能做到!| 今日最佳
  9. 牛顿儿时成绩很差,5岁开始接触物理,也许是他如此伟大的唯一原因!
  10. 每日一笑 | 一些关于学编程的领悟