题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。

例如输入“I am a student.”,则输出“student. a am I”。

分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。

由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。

还是以上面的输入为例子。翻转“I am a student.”中所有字符得到“.tneduts a ma I”,再翻转每个单词中字符的顺序得到“students. a am I”,正是符合要求的输出。

参考代码:

///
// Reverse a string between two pointers
// Input: pBegin - the begin pointer in a string
//        pEnd   - the end pointer in a string
///
void Reverse(char *pBegin, char *pEnd)
{if(pBegin == NULL || pEnd == NULL)return;while(pBegin < pEnd){char temp = *pBegin;*pBegin = *pEnd;*pEnd = temp;pBegin ++, pEnd --;}
}///
// Reverse the word order in a sentence, but maintain the character
// order inside a word
// Input: pData - the sentence to be reversed
///
char* ReverseSentence(char *pData)
{if(pData == NULL)return NULL;char *pBegin = pData;char *pEnd = pData;while(*pEnd != '\0')pEnd ++;pEnd--;// Reverse the whole sentenceReverse(pBegin, pEnd);// Reverse every word in the sentencepBegin = pEnd = pData;while(*pBegin != '\0'){if(*pBegin == ' '){pBegin ++;pEnd ++;continue;}// A word is between with pBegin and pEnd, reverse itelse if(*pEnd == ' ' || *pEnd == '\0'){Reverse(pBegin, --pEnd);pBegin = ++pEnd;}else{pEnd ++;}}return pData;
}

            

本文已经收录到《剑指Offer——名企面试官精讲典型编程题》一书中,有改动,书中的分析讲解更加详细,讨论了这个题目和左旋转字符串的联系,举一反三。欢迎关注。本文的英文版详见http://codercareer.blogspot.com/2011/09/no-07-reverse-words-in-sentence.html,欢迎感兴趣的朋友阅读并批评指正。

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

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

程序员面试题精选100题(07)-翻转句子中单词的顺序[算法]相关推荐

  1. 程序员面试题精选100题(03)-子数组的最大和[算法]

    题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, ...

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

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

  3. 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]

    题目:定义Fibonacci数列如下: /  0                      n=0 f(n)=      1                      n=1         \  f ...

  4. 程序员面试题精选100题(36)-在字符串中删除特定的字符[算法]

    题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"They are students."和"aeiou",则删除之后的第一个字符串变 ...

  5. 程序员面试题精选100题(09)-链表中倒数第k个结点[数据结构]

    题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode {       int       m_nKey;      ...

  6. 程序员面试题精选100题(41)-把数组排成最小的数[算法]

    题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{32,  321},则输出这两个能排成的最小数字32132.请给出解决问题的算法,并证明该算法. 分 ...

  7. 程序员面试题精选100题(26)-和为n连续正数序列[算法]

    题目:输入一个正数n,输出所有和为n连续正数序列. 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5.4-6和7-8. 分析:这是网易的一道面试题. 这道题和 ...

  8. 程序员面试题精选100题(14)-圆圈中最后剩下的数字[算法]

    题目:n个数字(0,1,-,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后,从被删除数字的下一个继续删除第m ...

  9. 程序员面试题精选100题(61)-数对之差的最大值[算法]

    题目:在数组中,数字减去它右边的数字得到一个数对之差.求所有数对之差的最大值.例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果. 分析:看到 ...

最新文章

  1. 900 多道 LeetCode 题解,这个 GitHub 项目值得 Star!
  2. 26岁已经是“双一流”高校博导!读博期间也曾两次想要退学......
  3. Bootstrap中的列表的使用
  4. [Cocos2d-x]Cocos2d-x 3.2 学习笔记
  5. Chrome 20对于HTML5最新支持的动态:颜色输入,网络信息API,CSS着色器
  6. Git:tag标签的使用
  7. Python数据结构与算法(1.2)——Python基础之变量与内置数据类型
  8. qualys java 误报_从拒绝到接受 解析漏洞管理的五个阶段
  9. python matplotlib打开相机
  10. matlab画图不想显示x轴数据,Matlab - 情节; 修改X轴值而不修改图形
  11. 输出的字体全部变成繁体字
  12. css 从右到左的方向调整
  13. 安卓远程控制软件哪个好用
  14. 计算机二级请假条,请假条的范文标准版
  15. FreeBSD安装中文字体和中文输入法
  16. awk 处理反算日志流量
  17. 电脑系统CMD命令dos命令大全
  18. 【功能测试05-熟悉tpshop项目】
  19. 实验.cc域名与.com域名在百度的权重谁高谁低
  20. 郑州钢丝网骨架塑料复合管应用领域

热门文章

  1. LR模型常见问题小议
  2. 机器学习之单变量线性回归(Linear Regression with One Variable)
  3. 近几年前端技术盘点以及 2016 年技术发展方向
  4. Java Review - PriorityQueue源码解读
  5. Java8 - 使用工厂方法 supplyAsync创建 CompletableFuture
  6. MySQL-日志二进制日志binlog初探
  7. MyBatis-11MyBatis动态SQL之【if】
  8. Java-查看JVM从哪个JAR包中加载指定类
  9. php 处理html,PHP解析HTML代码
  10. 浙江大学计算机与机械工程,中国26所“机械工程”大学经调整、合并,浙大、西交、同济升级...