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

前言:

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

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

点赞