题目描述:
JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
输入:
每个测试案例为一行,表示一句英文句子。
我们保证一个句子的单词数不会超过600,每个单词的长度也不会超过30。但是需要注意的是Fish是个不拘小节的人,有时候两个单词中间可能会有很多空格。为了方便起见,你可以认为一行的字符总数不会超过50000个,标点符号可以和普通字母一样处理。
输出:
对应每个测试案例,把翻转后的正确的句子单独输出一行。
样例输入:
student. a am I
I'm a Freshman and I like JOBDU!
样例输出:
I am a student.
JOBDU! like I and Freshman a I'm
分析:
本题是微软的面试题,这类问题是典型的旋转问题,或者称为循环移动问题。想要设计时间复杂度O(n)的算法,那么就必须得知道数组循环移位问题的最佳解法,如下:将数组abcd1234循环右移4位,abcd1234 → 4abcd123 → 34abcd12 → 234abcd1 → 1234abcd
  1. 将abcd逆序排列:abcd1234 → dcba1234
  2. 将1234逆序排列:dcba1234 → dcba4321
  3. 最后将整个数组逆序排列:dcba4321 → 1234abcd
这样就能在O(n)时间内完成循环右移。本题也可以运用这种思想来解决,先倒置每个单词,再倒置整个字符串即可。
总结:对于这种旋转问题或者循环移位问题,最佳解法一般是采用先局部逆序,后整体逆序的解法。
代码:
 #include <cstdio>
#include <cstring> #define MAXSIZE 50001 void reverse(char *str, int low, int high) {
while (low < high) {
char temp = str[low];
str[low] = str[high];
str[high] = temp;
low++;
high--;
}
} int main() {
char str[MAXSIZE];
while (gets(str)) {
int low = , high = ;
while (str[low] != '\0') {
high = low;
while (str[high] != ' ' && str[high] != '\0')
high++;
reverse(str, low, high - );
low = high;
while (str[low] == ' ' && str[low] != '\0')
low++;
} reverse(str, , strlen(str) - );
printf("%s\n", str);
}
}
 扩展:这里也给出字符串循环右移k位的代码
 #include <cstdio>
#include <cstring> #define MAXSIZE 1001 void reverse(char *str, int low, int high) {
while (low < high) {
char temp = str[low];
str[low] = str[high];
str[high] = temp;
low++;
high--;
}
} int main() {
char str[MAXSIZE];
int pivot;
while (scanf("%s %d", str, &pivot) != EOF) {
pivot %= strlen(str);
reverse(str, , pivot - );
reverse(str, pivot, strlen(str) - );
reverse(str, , strlen(str) - ); printf("%s\n", str);
}
return ;
}

[Jobdu] 题目1361:翻转单词顺序的更多相关文章

  1. 剑指Offer - 九度1361 - 翻转单词顺序

    剑指Offer - 九度1361 - 翻转单词顺序2013-11-23 02:45 题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fi ...

  2. 九度OJ 1361 翻转单词顺序

    题目地址:http://ac.jobdu.com/problem.php?pid=1361 题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Ca ...

  3. 剑指Offer面试题:34.翻转单词顺序VS左旋转字符串

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

  4. 【面试题042】翻转单词顺序VS左旋转字符串

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

  5. 《剑指offer》第五十八题(翻转单词顺序)

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

  6. 编程算法 - 翻转单词顺序 代码(C)

    翻转单词顺序 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个英文句子, 翻转句子中单词的顺序, 但单词内字符的顺序不变. 首先翻转(r ...

  7. 剑指 Offer 58 - I. 翻转单词顺序 + 双指针

    剑指 Offer 58 - I. 翻转单词顺序 Offer_58_1 题目描述 方法一:使用Split函数 package com.walegarrett.offer; /** * @Author W ...

  8. 力扣 - 剑指 Offer 58 - I. 翻转单词顺序

    题目 剑指 Offer 58 - I. 翻转单词顺序 思路1 假如题目要求我们翻转字符串,那么我们可以从末尾往前开始遍历每一个字符,同时将每一个字符添加到临时空间,最后输出临时空间的数据就完成翻转了, ...

  9. 【剑指Offer】翻转单词顺序列 解题报告(Python)

    [剑指Offer]翻转单词顺序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  10. 剑指 offer set 19 翻转单词顺序 && 字符串左旋

    题目 1. 翻转单词 student. a am I 转换成 I am a student. 2. 字符串左旋 abba 1 转成 bbaa 总结 1. 先对每个单词旋转, 再整齐旋转 2. 先翻转一 ...

随机推荐

  1. rsyslog masg和rawmsg的区别

    msg the MSG part of the message (aka "the message" ;)) message 的MSG 部分 rawmsg the message ...

  2. Unix/Linux环境C编程入门教程(4) Debian Linux环境搭建

    Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 1.广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,由于Deb ...

  3. Vxlan 原理

    https://www.gitbook.com/book/yeasy/openstack_understand_neutron/details 自己总结一下: 分析 VTEP的情况, 即Vxlan跟V ...

  4. python手记(9)

    本博客所有内容是原创,未经书面许可,严禁任何形式的转 http://blog.csdn.net/u010255642 tab #!/usr/bin/env python # example noteb ...

  5. C#中经常使用的几种读取XML文件的方法

    XML文件是一种经常使用的文件格式,比如WinForm里面的app.config以及Web程序中的web.config文件,还有很多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖 ...

  6. COM组件简介

    面向对象的思想难以适应这种分布式软件模型,于是组件化程序设计思想得到了迅速的发展. 按照组件化的程序设计的思想,复杂的应用程序被设计成一些小的,功能单一的组件模块,这些组件模块可以运行在同一台机器上, ...

  7. The file “XXX” couldn’t be opened because you don’t have permission to view it.解决方法:

    The file “XXX” couldn’t be opened because you don’t have permission to view it.解决方法:   解决方法:直接点击Xcod ...

  8. CM 0313 Review

    中午无聊看了贴吧,看到有人截图说CM有爱的故事.看到SE03CH13,觉得图有点印象,似乎我很是记得这一集.于是刚才看了一下,嗯,果然记得.是我头一次翻译美剧的时候,7年前. 剧情还可以吧,剧中的Ji ...

  9. D - Common Subsequence

    D - Common Subsequence Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I ...

  10. mybaitis配置信息

    在配置mybatis当中,jdbcType的名称要大写,时间类型DATE只能传入年月日,要想传入时分秒,应该使用TIMESTAMP http://www.blogjava.net/hello-yun/ ...