算法习题10:翻转句子中单词的顺序
2013-10-14 14:30
211 查看
翻转句子中单词的顺序。
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。
为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。
-----------------
难得这道题想得和答案比较相近
看见这题时候有先是一种想法
例如:my name is ylf.
1、利用词语翻转,即两个指针,一个指向头,一个指向尾,向中间移动,每次交换字母,(注意这里相遇判断 一定是p1 == p2??)如果是abcd就不存在p1==p2 这个细节大家注意下,我这里用的移动次数来终止
但着道题蛋疼就在于词语的本身顺序不能动,好了,那就再拿两个字符数组,先把头尾要交换的存进去,例如my存入a数组,ylf存入B数组,再用上面方法交换,想法很美好,可是两个字符串长度不一样,怎么交换呢?没关系,在new一个新数组,长度strlen(originArr) 这就没问题了把,是的!着就ok啦
2、我们再仔细想想,既然第一种方法可以让句子所有单词都颠倒了,那么得到的只不过是单词内部也颠倒了,我们不是可以再颠倒一次单词,那就负负得正了
比如颠倒例子成 : .fly si eman ym
然后找到第一个单词(用空格判断即可)再颠倒一下 如此找到结尾
ylf. is name my 不久出来了么。。。
看起来简单,尼码,写起来总是有考虑不到位的,还是写得不够多,继续加油把
这里给大家考虑个问题,如果一开是就是空格呢?
----------------------output----------------------
yuan ling feng.
feng. ling yuan
注意这里开始时候空格 以及空格个数问题
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。
为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。
-----------------
难得这道题想得和答案比较相近
看见这题时候有先是一种想法
例如:my name is ylf.
1、利用词语翻转,即两个指针,一个指向头,一个指向尾,向中间移动,每次交换字母,(注意这里相遇判断 一定是p1 == p2??)如果是abcd就不存在p1==p2 这个细节大家注意下,我这里用的移动次数来终止
但着道题蛋疼就在于词语的本身顺序不能动,好了,那就再拿两个字符数组,先把头尾要交换的存进去,例如my存入a数组,ylf存入B数组,再用上面方法交换,想法很美好,可是两个字符串长度不一样,怎么交换呢?没关系,在new一个新数组,长度strlen(originArr) 这就没问题了把,是的!着就ok啦
2、我们再仔细想想,既然第一种方法可以让句子所有单词都颠倒了,那么得到的只不过是单词内部也颠倒了,我们不是可以再颠倒一次单词,那就负负得正了
比如颠倒例子成 : .fly si eman ym
然后找到第一个单词(用空格判断即可)再颠倒一下 如此找到结尾
ylf. is name my 不久出来了么。。。
看起来简单,尼码,写起来总是有考虑不到位的,还是写得不够多,继续加油把
这里给大家考虑个问题,如果一开是就是空格呢?
//============================================================================ // Name : RevertSentence.cpp // Author : YLF // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <string.h> #include <stdio.h> using namespace std; #define MAX 100 void revert(char* sentence, int num); void process(char* &p1, char* &p2); char space = ' '; int main() { char sentence[MAX]; char c; int index = 0; gets(sentence); index = strlen(sentence); revert(sentence, index); int i = 0; for(;i<index;i++) cout<<sentence[i]; return 0; } void revert(char* sentence, int num){ char* p; char* p1; char* p2; p1 = sentence; p2 = p1 + num -1; //先颠倒整个序列 process(p1,p2); //逐个逐个单词矫正 p1 = sentence; p2 = sentence; p = sentence; while(p<(sentence+num)){ while((p2<(sentence+num)) && (*p2 != ' ')) p2++; p = p2 + 1; p2--; if(*p1 != ' ')//这里是防止开始时候有空格 或者有多个空格 process(p1,p2); p1 = p; p2 = p; } } void process(char* &p1, char* &p2){ int flag = (p2 - p1)/2; while(flag >= 0 ){ char temp; temp = *p1; *p1 = *p2; *p2 = temp; p1++; p2--; flag--; } }
----------------------output----------------------
yuan ling feng.
feng. ling yuan
注意这里开始时候空格 以及空格个数问题
相关文章推荐
- 每天学习一算法系列(10)(输入一句英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以空格符隔开)
- 10、翻转句子中单词的顺序
- 微软面试100之10 翻转句子中单词的顺序
- 程序员面试50题(3)—翻转句子中单词的顺序[算法]
- 算法- 翻转句子中单词的顺序
- 程序员面试题精选100题(07)-翻转句子中单词的顺序[算法]
- [面试算法题重做]翻转句子中单词的顺序
- 翻转句子中单词的顺序[算法]
- IT公司100题-10-翻转句子中单词的顺序
- 算法讨论(六)--翻转句子中单词的顺序
- 程序员面试100题(算法)之翻转句子中单词的顺序
- IT公司100题-10-翻转句子中单词的顺序
- 程序员面试题精选100题(07)-翻转句子中单词的顺序[算法]
- 【经典算法】:翻转句子中单词的顺序
- NO_10 翻转句子中单词的顺序。
- 程序员面试题精选-翻转句子中单词的顺序[算法]
- 每日一道算法题5——翻转句子中单词的顺序
- 微软算法100题10 翻转句子中单词的顺序
- 10、翻转句子中单词的顺序
- 微软算法100道题-----翻转句子中单词的顺序