UVa 483 Word Scramble

📅 2026/7/10 23:17:11 👁️ 阅读次数 📝 编程学习
UVa 483 Word Scramble

题目描述

题目要求将输入文本中每个单词的字母顺序反转,同时保持单词之间的顺序和空白字符不变。单词是由可打印字符组成的连续序列,由空白字符分隔。

输入格式

输入包含若干行,每行包含若干个单词(由空白字符分隔)。输入以文件结束符(EOF\texttt{EOF}EOF)终止。

输出格式

输出与输入相同的行数和单词顺序,但每个单词内的字母顺序反转。

样例

输入

I love you. You love me. We're a happy family.

输出

I evol .uoy uoY evol .em er'eW a yppah .ylimaf

题目分析

本题的核心是逐行处理输入,识别出每个单词并反转其字母顺序,同时保留空白字符。

算法步骤

  • 逐行读取输入。
  • 遍历行中的每个字符:
    • 若字符为空白字符(空格、制表符等),直接输出。
    • 若字符为非空白字符,则收集连续的单词字符,反转后输出。
  • 输出换行。

注意点

  • 标点符号(如句点、逗号等)被视为单词的一部分,需要一起反转。
  • 单词边界由空白字符决定(包括空格、制表符等)。
  • 保留原始空白字符的个数和类型。

复杂度分析

每个字符处理一次,时间复杂度O(L)O(L)O(L)LLL为输入总长度。

代码实现

// Word Scramble// UVa ID: 483// Verdict: Accepted// Submission Date: 2016-07-13// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);string line;while(getline(cin,line)){intindex=0;while(index<line.length()){if(isblank(line[index]))cout<<line[index];else{string block;while(index<line.length()&&isblank(line[index])==false){block+=line[index];index++;}reverse(block.begin(),block.end());cout<<block;continue;}index++;}cout<<endl;}return0;}