您的位置:首页 > 职场人生

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

2013-09-11 19:08 423 查看
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“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] !='\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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: