题目链接地址:
题目描述:
JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
输入:
每个测试案例为一行,表示一句英文句子。
我们保证一个句子的单词数不会超过600,每个单词的长度也不会超过30。但是需要注意的是Fish是个不拘小节的人,有时候两个单词中间可能会有很多空格。为了方便起见,你可以认为一行的字符总数不会超过50000个,标点符号可以和普通字母一样处理。
输出:
对应每个测试案例,把翻转后的正确的句子单独输出一行。
样例输入:
student. a am I
I'm a Freshman and I like JOBDU!
样例输出:
I am a student.
JOBDU! like I and Freshman a I'm
解题思路:
遍历英文句子,然后把句子中的单词全部保存到二维数组中,最后再逆序输出二维数组即可。但是一直报Presentation Error,后来上论坛讨论区 【1361】翻转单词顺序 看了一下。
看到7楼和8楼的评论才恍然大悟,原来英语句子中的空格也要倒着输出。。。
例如,如果输入 _1_ _2_ _ _3_ _ _ _ (_ 表示空格)
则应该输出 _ _ _ _3_ _ _2_ _1_
因此我的做法是开一个长度是单词数目2倍的二维数组,在遍历英语句子的时候,先把单词保存到二维数组中,然后再把单词后面的空格存放到二维数组的下一个元素中,最后再逆序输出该二维数组。
AC代码如下:
#include<stdio.h>
#include<string.h>
#define SENTENCElEN 50001 // 英文句子的长度
#define WOEDNUMBER 1201 // 单词数和两个单词中间的空格数目
#define WORDLEN 31 // 单词的长度
char sentence[SENTENCElEN];
/**
* 翻转句子中的单词顺序
* @param sentence 输入的英语句子
* @param len 英语句子的长度
* @param words 保存单词和空格的二维数组
* @return void
*/
void overturnWordSequence(char sentence[],int len,char words[][WORDLEN])
{
int i = 0;
int count = 0; // 统计单词的个数
int letterIndexInWord = 0; // 字符在单词中的位置
while(i < len)
{
// 存放字符串中的单词和标点符号
while(i < len && ' ' != sentence[i])
{
words[count][letterIndexInWord] = sentence[i];
letterIndexInWord++;
i++;
}
if(letterIndexInWord > 0)
{
words[count][letterIndexInWord] = '\0';
count++;
letterIndexInWord = 0;
}
// 存放字符串中的空格
while(i < len && ' ' == sentence[i])
{
words[count][letterIndexInWord] = sentence[i];
letterIndexInWord++;
i++;
}
if(letterIndexInWord > 0)
{
words[count][letterIndexInWord] = '\0';
count++;
letterIndexInWord = 0;
}
}// while(i < len)
// 逆序输出字符串中的单词和空格
i = count - 1;
while(i >= 0)
{
printf("%s",words[i]);
i--;
}
printf("\n");
}
int main()
{
char words[WOEDNUMBER][WORDLEN];
int len;
while(gets(sentence))
{
len = strlen(sentence);
overturnWordSequence(sentence,len,words);
}
return 0;
}
/**************************************************************
Problem: 1361
User: blueshell
Language: C
Result: Accepted
Time:90 ms
Memory:964 kb
****************************************************************/