字符串面试题系列之一:翻转字符串顺序

前言

    从今天开始,本程序员开始专注写自己的博客了。之前我收集到了不少好的文章,无论从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;

}

【结论】

   我们输入I am a students. 输出如下:
5

作者

   出处:http://www.cnblogs.com/gina

   本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

你可能感兴趣的:(字符串)