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