前言
从今天开始,本程序员开始专注写自己的博客了。之前我收集到了不少好的文章,无论从cnblog上面还是csdn上面。我从中受益匪浅。我觉得知识属于大家的,我也应该贡献自己的思路。那么首先从最简单的算法开始。 我打算从字符串算法开始,因为字符串处理是我们编程当中经常会遇到的,比如求子串,逆转字符串等等。好了,废话不多说了。下面开始进入正题。
本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。
正文
【题目】
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。
【例子】
输入“I am a student.”,则输出“student. a am I”。
【分析】
对于一个英文句子,大家都知道是用空格分隔开的。那么如何翻转英文句子而保持里面单词顺序不变呢?当然我们可以开辟一个新的空间,然后对源字符串从后面开始扫描,遇到空格停止,将子串复制到目标空间中。这是我们直观思维。那么这样需要开辟一个新的空间,空间效率应该是O(n)。那么我们在想一想,首先我们将整个字符串翻转,再将各个子串再翻转(子串以空格分开)。这样是不是就达到目的了呢。就拿上面那个例子来说。整个字符串翻转之后我们得到".tneduts a ma I", 再对子串翻转,我们得到"student. a am I"。这就是我们得到的结果。代码如下:
【代码】
#include <iostream> #include <cstring> void word_reverse( char * const word, int start, int end ) { char ch; while( start < end ) { ch = word[start]; word[start] = word[end]; word[end] = ch; start++; end--; } } char * setence_reverse( char * const setence, int length ) { int end = 0; word_reverse( setence, 0, length - 1 ); for( int start = 0; start < length; start += end + 1 ) { for( end = start; end < length && setence[end] != ' '; end++ ); word_reverse( setence, start, end-1 ); } return setence; } int main( int argc, char ** argv ) { char data[] = "I am a students."; char * pResult = setence_reverse( data, strlen(data) ); std::cout << pResult << std::endl; return 0; }
【结论】
作者
出处:http://www.cnblogs.com/gina
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。