eg: input : hello wolrd do3 do2 do1
output: do1 do2 do3 world hello
先给一个较简单的方法:
思路:1.先反转整体字符串 遍历 n/2
2.再反转单词即可 n+m*word/2
void reserve_str(char * str, int pos, int len)
{
if( !str || !len || !(len-1) )
return;
for(int i = 0; i < len/2; i++) {
char temp_c = *(str+pos+i);
*(str+pos+i) = *(str+pos+len-1-i);
*(str+pos+len-1-i) = temp_c;
}//for i
}
int reserve_word(char * str)
{
if( !str ) {
cerr << "str is null\n";
return 0;
}
int len = strlen(str);
if( len == 1 )
return 1;
reserve_str(str, 0, strlen(str));
cout << str << endl;
int p = 0;
for(int i = 0; i <= len; i++) {
if( *(str+i) == ' ' ) {
reserve_str(str, p, i-p);
//cout << str << endl;
p = i + 1;
} else if( *(str+i) == '\0' ) {
reserve_str(str, p, i-p);
}
}//for i
return 1;
}
如上是一个较简单的方法。遍历的次数稍微有些多。
思路:反转字符串 但在反转中完成对单词的反转,这就需要两个变量来记录索引的位置。
遍历次数:n/2+wordlen/2*wordnum
int _reserve_word(char * str)
{
if( !str )
return 0;
int len = strlen(str);
int head_word_begin = 0; //head guard index
int head_word_end = 0;
int tail_word_begin = len-1; //tail guard index
int tail_word_end = len-1;
for(int i = 0; i <= len/2; i++) {
if( i < len/2 ) {
char temp_c = *(str+i);
*(str+i) = *(str+len-1-i);
*(str+len-1-i) = temp_c;
}
if( *(str+i) == ' ' ) {
head_word_end = i;
reserve_str(str, head_word_begin, head_word_end-head_word_begin);
head_word_begin = head_word_end + 1;
}
if( *(str+len-1-i) == ' ' ) {
tail_word_begin = len-1-i;
reserve_str(str, tail_word_begin+1, tail_word_end-tail_word_begin);
tail_word_end = tail_word_begin - 1;
}
}
cout << str << endl;
return 1;
}