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

来源:互联网 发布:电脑上画画的软件 编辑:程序博客网 时间:2024/05/22 23:34

 

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

 

#include<stdio.h>#include<assert.h>//45minvoid 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] !='\0')  {  i++;  }  int strlen = i; //得到字符串的长度  //整个字符串进行翻转  reverse(Str,0,strlen-1);  //每个单词进行翻转  int j ;  for(j = 0; j < strlen-1; j++)  //最后一个那个'\0'不用管它  {           int start = j;//每个单词的起始位置   int end = j;  //每个单词介绍的位置,初始化为j(新单词起始的位置)   while(Str[j] != ' '&&Str[j] != '\0' )  //遇到空格或结束符的时候退出,否则继续判断   {   end++;     j++;   }        reverse(Str,start, end-1);  //对单个字符进行翻转    }       }int main(){    char sentence[]="I am a student!";      ReverceSentence(sentence); printf("%s",sentence);printf("\n");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!='\0')     {       if(*start==' ')   //单词起始至非空格字符          {            start++;            end++;            continue;                 }       else if(*end==' '||*end=='\0')    //结束至空格或结束符前一个字符       {            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; }}