九度OJ-题目1361:翻转单词顺序

题目链接地址:

九度OJ-题目1361:翻转单词顺序


题目描述:
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
****************************************************************/

猜你喜欢

转载自blog.csdn.net/pengyan0812/article/details/46472947