H面试程序(4):翻转句子中单词的顺序 .

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。

#include<stdio.h>
#include<assert.h>
//45min
void swap(char *a, char *b)
{
	assert(a);
	assert(b);
	char temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

void reverse(char * str,int  start,int end)
{   
	assert(str);

	int j = (end-start)/2;

	for(int i =0; i<=j; i++)
		swap(&(str[start++]), &(str[end--]));
}

void ReverceSentence(char * Str)
{
	  assert(Str);
	  int i = 0;
	  while(Str[i] !='')
	  {
		  i++;
	  }
	  int strlen = i; //得到字符串的长度

	  //整个字符串进行翻转
	  reverse(Str,0,strlen-1);

	  //每个单词进行翻转

	  int j ;
	  for(j = 0; j < strlen-1; j++)  //最后一个那个''不用管它
	  {
           int start = j;//每个单词的起始位置
		   int end = j;  //每个单词介绍的位置,初始化为j(新单词起始的位置)
		   while(Str[j] != ' '&&Str[j] != '' )  //遇到空格或结束符的时候退出,否则继续判断
		   {
			   end++;  
			   j++;
		   }		  	   
		   reverse(Str,start, end-1);  //对单个字符进行翻转	  
	  }       
}

int main()
{
    char sentence[]="I am a student!";  
    ReverceSentence(sentence); 
	printf("%s",sentence);
	printf("
");
	return 0;
}


 

网上参考答案

#include <iostream>
using namespace std;

void Reverse(char *start,char *end) //翻转字符串
{
     if(start==NULL||end==NULL)
        return;
    
     char temp;
     while(start<end)
     {
            temp=*start;
            *start=*end;
            *end=temp;
            start++;
            end--;        
     }
}

char *ReverceSentence(char *pstr)
{
    if(pstr==NULL)
       return NULL;
    
     //先将整个句子翻转
     char *start=pstr;
     char *end=pstr+strlen(pstr)-1;
     Reverse(start,end);
    
     start=pstr;
     end=pstr;
    
     //取出一个个单词,翻转之
     while(*start!='')
     {
       if(*start==' ')   //单词起始至非空格字符
          {
            start++;
            end++;
            continue;       
          }
       else if(*end==' '||*end=='')    //结束至空格或结束符前一个字符
       {
            Reverse(start,--end);
            start=++end;
       } 
       else
         end++; 
     }
     return pstr;
}
int main()
{
      char sentence[]="I am a student!";
      char *reverced=ReverceSentence(sentence);
      cout<<reverced<<endl;
      system("pause");
      return 0;
}


 

/*把给定的字符串的begin到end之间的部分翻转*/
void _reverse(char *str, int begin, int end)
{
 int i = 0;
 while(i <= (end - begin) / 2)
 {
  swap(str[begin + i], str[end - i]);
  ++i;
 }
}


 

原文地址:https://www.cnblogs.com/riskyer/p/3315233.html