面试100题系列之8单词反转 VS HDU1062——text reverse
2013-04-07 18:49
681 查看
给一个句子,将句子中的单词反转。
思路:先将句子整体反转,再将单词一个个进行反转。
*如果该字符是空格,前一个字符是单词,那么就在此处反转
*如果该字符是单词,其前一个字符是空格,则记录下单词开始的位置
特殊情况:句子后面是一串空格,输出的时候可能不想句子前面有空格,所以在反转之前需要先将空格滤去。
参考另外一篇博客:http://blog.csdn.net/kay_zhyu/article/details/8694661
另外一种问题的变形:HDU 1062:http://acm.hdu.edu.cn/showproblem.php?pid=1062
其实两道题是一样的
思路:先将句子整体反转,再将单词一个个进行反转。
*如果该字符是空格,前一个字符是单词,那么就在此处反转
*如果该字符是单词,其前一个字符是空格,则记录下单词开始的位置
特殊情况:句子后面是一串空格,输出的时候可能不想句子前面有空格,所以在反转之前需要先将空格滤去。
#include<stdio.h> #include<string.h> char a[100]; void Invert(char *buf, int Begin, int End) { if(!buf || Begin > End) return; char ch; int i,j; for(i = Begin,j = End - 1; i < j; ++i,--j) { ch = buf[i]; buf[i] = buf[j]; buf[j] = ch; } } //找到每个单词在句子中的起始位置 void InvertWord(char *buf) { if(!buf) return; bool IsWordBegin = false; int i; int start; int nLen = strlen(buf); //过滤掉句子末尾的空格 i = nLen - 1; while(i >= 0 && buf[i] == ' ') --i; buf[++i] = '\0'; //整体反转 Invert(buf, 0, i); for(i = 0; buf[i] != '\0'; ++i) { //字符后的第一个空格,反转单词 if(buf[i] == ' ' && IsWordBegin) { Invert(buf, start, i); IsWordBegin = false; } //空格后的第一个单词,记录下标 else if(buf[i] != ' ' && !IsWordBegin) { start = i; IsWordBegin = true; } } //反转最后一个单词,如果长度大于0,一定是以字符结尾 if(i > 0) Invert(buf, start, i); } void main() { while(gets(a)) { InvertWord(a); puts(a); } }当然这个问题还可以扩展,比如说输入的white space(包括空格和换行符)滤去,单词与单词中间只保留一个空格。
参考另外一篇博客:http://blog.csdn.net/kay_zhyu/article/details/8694661
另外一种问题的变形:HDU 1062:http://acm.hdu.edu.cn/showproblem.php?pid=1062
其实两道题是一样的
#include<stdio.h> #include<string.h> void Invert(char *buf, int Begin, int End) { if(!buf || Begin > End) return; char ch; int i,j; for(i = Begin,j = End - 1; i < j; ++i,--j) { ch = buf[i]; buf[i] = buf[j]; buf[j] = ch; } } //找到每个单词在句子中的起始位置 void InvertWord(char *buf) { if(!buf) return; bool IsWordBegin = false; int i; int start; int nLen = strlen(buf); for(i = 0; i < nLen; ++i) { //字符后的第一个空格,反转单词 if(buf[i] == ' ' && IsWordBegin) { Invert(buf, start, i); IsWordBegin = false; } //空格后的第一个单词,记录下标 else if(buf[i] != ' ' && !IsWordBegin) { start = i; IsWordBegin = true; } } //如果长度大于0,反转最后一个单词 if(i > 0 && IsWordBegin) Invert(buf, start, i); } void main() { char a[1005]; int n; scanf("%d",&n); getchar(); while(n--) { gets(a); InvertWord(a); puts(a); } }
相关文章推荐
- 【从零单排之微软面试100题系列】10之翻转单词顺序
- 【从零单排之微软面试100题系列】08之反转链表
- HDU 1062 Text Reverse 字符串反转
- 微软面试100题系列---二叉查找树的反转
- hdu 1062 Text Reverse 字符串反转
- 关于本微软等公司数据结构+算法面试100题系列的郑重声明
- HDU 1062 Text Reverse
- 面试100题系列之13大数的四则运算
- 微软等面试100题系列--(1-20)
- 微软面试100题系列---判断两个链表是否相交
- hdu 1062 Text Reverse(水)
- HDU--1062:Text Reverse (字符串)
- hdu 1062 Text Reverse
- 剑指Offer(Java版):反转单词顺序VS左旋转字符串
- 【从零单排之微软面试100题系列】18之约瑟夫环问题
- hdu 1062 Text Reverse
- 链表节点面试100题系列之1将查找二叉树转换成有序的双向链表
- 【从零单排之微软面试100题系列】03之求子数组的最大和
- 【从零单排之微软面试100题系列】04之二叉树中和为某一值的路径
- 【从零单排之微软面试100题系列】06之根据上排数写出下排数