7-9 说反话-加强版

news2024/12/23 14:02:25

 

分数 20

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:

Hello World   Here I Come

输出样例:

Come I Here World Hello

感谢杭州电子科技大学李卫明老师修正数据! 感谢浙江工业大学之江学院石洗凡老师修正测试点提示。

代码长度限制

16 KB

时间限制

300 ms

内存限制

64 MB

我的答案:

分析过程:

为了解决这个问题,我们需要首先确定每个单词的起始和结束位置,然后将这些单词按照逆序输出。

一种简单的方法是从后向前读取字符串,并记录单词的起始和结束位置。每当我们从一个非空格字符移动到一个空格字符时,我们就可以确定一个单词的结束位置,然后继续向前读取,直到遇到下一个非空格字符,该位置为单词的起始位置。现在我们可以输出从起始到结束位置的单词,并在输出下一个单词之前添加一个空格。

解题步骤:

  1. 读入字符串。
  2. 从字符串的尾部开始遍历。
  3. 如果找到一个非空格字符,标记为单词的结束位置。
  4. 继续向前遍历,直到找到一个空格字符或达到字符串的头部,此位置+1即为单词的起始位置。
  5. 输出从起始位置到结束位置的单词。
  6. 如果当前位置不是字符串的起始位置,则输出一个空格,并继续从上一步的起始位置-1继续查找下一个单词。
  7. 重复步骤3-6直到遍历完整个字符串。

C语言:

#include <stdio.h>
#include <string.h>

int main() {
    char str[500001];
    gets(str);  // 读入字符串
    int length = strlen(str);  // 获取字符串长度
    int end, start, isFirst = 1;

    for (end = length - 1; end >= 0;) {
        if (str[end] != ' ') {  // 找到单词的结束位置
            start = end;
            while (start >= 0 && str[start] != ' ') {  // 找到单词的起始位置
                start--;
            }
            start++;

            // 输出单词
            if (isFirst) {
                isFirst = 0;
            } else {
                printf(" ");
            }
            for (int i = start; i <= end; i++) {
                printf("%c", str[i]);
            }
            end = start - 2;
        } else {
            end--;
        }
    }

    return 0;
}

C++:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    getline(cin, str);  // 读入字符串
    int end, start, length = str.length();
    bool isFirst = true;

    for (end = length - 1; end >= 0;) {
        if (str[end] != ' ') {
            start = end;
            while (start >= 0 && str[start] != ' ') {
                start--;
            }
            start++;

            // 输出单词
            if (isFirst) {
                isFirst = false;
            } else {
                cout << " ";
            }
            for (int i = start; i <= end; i++) {
                cout << str[i];
            }
            end = start - 2;
        } else {
            end--;
        }
    }

    return 0;
}

这两种解决方案基本上是相同的,但是C++版本使用了C++标准库中的字符串处理函数,而C版本使用了C标准库中的函数。

我将逐一解析每个步骤:

1. **读入字符串。**
   - 首先,我们需要拥有一个字符串才能开始处理。这一步是获取输入。

2. **从字符串的尾部开始遍历。**
   - 为何从尾部开始而不是头部呢?因为我们的目标是将句子的单词顺序反转。从尾部开始遍历可以使我们首先找到最后的单词,这样在输出时,它就变成了第一个单词。

3. **如果找到一个非空格字符,标记为单词的结束位置。**
   - 为何是非空格字符?因为英文单词是由字母组成,并用空格分隔。当我们从后向前遍历并遇到第一个非空格字符时,我们知道我们已经找到了一个单词的结束位置。

4. **继续向前遍历,直到找到一个空格字符或达到字符串的头部,此位置+1即为单词的起始位置。**
   - 既然我们找到了单词的结束,下一步自然是找到它的开始。从当前位置继续向前遍历,直到遇到一个空格(这意味着单词结束了)或字符串的开始位置(对于第一个单词来说)。记住,我们已经确定了单词的结束位置,所以我们知道单词的起始和结束位置之间的字符构成了这个单词。

5. **输出从起始位置到结束位置的单词。**
   - 有了单词的起始和结束位置,我们可以直接输出它。

6. **如果当前位置不是字符串的起始位置,则输出一个空格,并继续从上一步的起始位置-1继续查找下一个单词。**
   - 这步确保了单词间只有一个空格。因为我们在输出一个单词后可能有多个空格(例如输入字符串有多个连续的空格),我们跳过这些额外的空格并找到下一个单词的结束位置。

7. **重复步骤3-6直到遍历完整个字符串。**
   - 我们将重复这个过程,直到我们处理了字符串中的每一个字符,从而保证了每个单词都被反向输出。

总结:这种方法的关键在于它从尾到头遍历字符串并使用空格作为单词分隔符。在输出时,这确保了我们首先输出的是最后一个单词,然后是倒数第二个单词,以此类推,从而达到了反转单词顺序的目的。

总结:

这道题目的主题是“说反话”,但它实际上涉及了许多基础的编程和数据处理技能。通过这题,我们可以学到以下几点:

1. **字符串操作**:如何遍历、如何标记单词的开始和结束,以及如何根据标记输出子串。

2. **逆序处理**:对数据进行反向处理是一个常见的编程问题,不仅仅局限于字符串。

3. **特定字符的定位与跳过**:在这个场景中,是空格作为分隔符。但在其他上下文中,我们可能需要跳过逗号、制表符或其他字符。

4. **边界条件的处理**:如何处理字符串的开始和结束、如何处理多余的空格等,都是需要考虑的边界条件。

5. **优化处理**:尽管这道题的初级解决方案是从尾到头遍历字符串,但还有其他方法,例如分割字符串并存储在数组或其他数据结构中,然后逆序输出。选择哪种方法取决于具体的需求和约束。

6. **实际应用的启示**:在真实世界的应用中,我们可能需要处理各种文本数据,如日志文件、用户输入等。学会如何有效地处理字符串和文本是任何编程语言中的一个重要技能。

总的来说,这道题目提供了对字符串处理的实践经验,并强调了为何这种能力在实际应用编程中是如此重要。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/905095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker创建 LNMP 服务+Wordpress 网站平台

Docker创建 LNMP 服务Wordpress 网站平台 一.环境及准备工作 1.项目环境 公司在实际的生产环境中&#xff0c;需要使用 Docker 技术在一台主机上创建 LNMP 服务并运行 Wordpress 网站平台。然后对此服务进行相关的性能调优和管理工作。 容器 系统 IP地址 软件 nginx centos…

Log4j反序列化命令执行漏洞(CVE-2017-5645)Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

一.Log4j反序列化命令执行漏洞(CVE-2017-5645&#xff09; Apache Log4j是一个用于Java的日志记录库&#xff0c;其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码 环境&#xff1a;vulhub 工具下载地址&#xff1…

Docker容器:docker基础及网络

Docker容器&#xff1a;docker基础及安装 一.docker容器概述 1.什么是容器 &#xff08;1&#xff09;Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 &#xff08;2&#xff09;是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵…

sh 脚本循环语句和正则表达式

目录 1、循环语句 1、for 2、while 3、until 2、正则表达式 1、元字符 2、表示次数 3、位置锚定 4、分组 5、扩展正则表达式 1、循环语句 循环含义 将某代码段重复运行多次&#xff0c;通常有进入循环的条件和退出循环的条件 重复运行次数 循环次数事先已知 循环次…

RS232、RS422、RS485硬件及RS指令、RS2指令应用知识学习

RS232、RS422、RS485硬件及RS指令、RS2指令应用知识学习 一、串行&#xff08;异步/同步)通讯、并行通讯、以太网通讯 二、单工通讯/半双工通讯/双工通讯 三、常用硬件接口&#xff08;工业上基本是RS485两线制的接线&#xff09; 常用硬件接口RS232/RS422/RS485&#xff0c;…

Delegates.observable追踪观察可变数据更新,Kotlin

Delegates.observable追踪观察可变数据更新&#xff0c;Kotlin import kotlin.properties.Delegates import kotlin.reflect.KPropertyclass Person {var name: String by Delegates.observable("fly") { prop: KProperty<*>, old: String, new: String ->p…

SpringBoot 学习(04):Idea 中控制启动命令的详细过程 环境区分案例

Idea 启动SpringBoot的命令 C:\Users\Administrator\.jdks\corretto-17.0.8\bin\java.exe -XX:TieredStopAtLevel1 -Dspring.output.ansi.enabledalways -Dcom.sun.management.jmxremote -Dspring.jmx.enabledtrue -Dspring.liveBeansView.mbeanDomain -Dspring.applica…

EasyRecovery14数据恢复软件支持各类存储设备的数据恢复

EasyRecovery14数据恢复软件专业数据恢复软件支持电脑、相机、移动硬盘、U盘、SD卡、内存卡、光盘、本地电子邮件和 RAID 磁盘阵列等各类存储设备的数据恢复。 目前市面上有许多数据恢复软件&#xff0c;但褒贬不一&#xff0c;而且数据恢复软件又不是一款会被经常使用的软件&a…

【多模态】26、视觉-文本多模态任务超详细介绍 「CLIP/LSeg/ViLD/GLIP/ALBEF/BLIP/CoCa/BEIT」

文章目录 准备知识一、CLIP&#xff1a;不同模态简单对比的方法更适合于图文检索1.1 CLIP 在分割上的改进工作1.1.1 LSeg1.1.2 Group ViT 1.2 CLIP 在目标检测上的改进工作1.2.1 ViLD1.2.2 GLIPv11.2.3 GLIPv2 二、ViLT/ALBEF &#xff1a;多模态融合在 VQA/VR 任务中更重要三、…

基于protobuf和httplib的在线通讯录项目框架|Protobuf应用小项目

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/categ…

学习设计模式之适配器模式,但是宝可梦

前言 作者在准备秋招中&#xff0c;学习设计模式&#xff0c;做点小笔记&#xff0c;用宝可梦为场景举例&#xff0c;有错误欢迎指出。 适配器模式 意图&#xff1a;将一个类的接口转换成客户希望的另一个接口 主要解决&#xff1a;把现有对象放到新环境里&#xff0c;而新…

leetcode几个数组题

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合 因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添元素的时候&#xff0c;就难免要移动其他元素的地址 二分查找 移除元素 有序数组的平方 209.长度最小的子数组

设计模式——开闭原则

文章目录 基本介绍看下面一段代码方式 1 的优缺点改进的思路分析 基本介绍 开闭原则&#xff08;Open Closed Principle&#xff09;是编程中最基础、最重要的设计原则 一个软件实体如类&#xff0c;模块和函数应该对扩展开放(对提供方)&#xff0c;对修改关闭(对使用方)。用抽…

wustoj2008折扣

#include <stdio.h> int main() {int n,m;double c;scanf("%d%d",&n,&m);cn*(m/10.00);printf("%.2lf",c);return 0;}

茂名 湛江阳江某学校 ibm x3850服务器维修经历

简介&#xff1a;中国广东省阳江市某中学联想 IBM System x3850 x6服务器维修 io板故障处理经历分享&#xff1a; 这一天一位阳江的老师经其他学校老师介绍推荐对接我&#xff0c;说他们学校有一台ibm服务器出问题了&#xff0c;老师大致跟我描述了一下这台服务器发生故障的前…

3、Spring之底层架构核心概念解析

BeanDefinition BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。比如: class,表示Bean类型scope,表示Bean作用域,单例或原型等lazyInit:表示Bean是否是懒加载initMethodName:表示Bean初始化时要执行的方法destroyMethodName:表示Be…

【算法刷题之数组篇(1)】

目录 1.leetcode-59. 螺旋矩阵 II&#xff08;题2.题3相当于二分变形&#xff09;2.leetcode-33. 搜索旋转排序数组3.leetcode-81. 搜索旋转排序数组 II(与题目2对比理解)&#xff08;题4和题5都是排序双指针&#xff09;4.leetcode-15. 三数之和5.leetcode-18. 四数之和6.leet…

Python制作爱心并打包成手机端可执行文件

前言 本文是想要将python代码打包成在手机上能执行的文件 尝试了几个库&#xff0c; 有这也那样的限制&#xff0c;最终还是选了BeeWare 环境&#xff1a;python3.7.x 开始 找到打包有相关工具os-android-apk-builder&#xff0c;buildozer&#xff0c;cx_Freeze&#xff…

AMBA总线协议(1)——概述

目录 一、AMBA总线简介 二、基于AMBA 的典型微控制器 三、AHB介绍 1、概述 2、典型结构 &#xff08;1&#xff09; AHB 主机&#xff08;AHB Master&#xff09; &#xff08;2&#xff09;AHB 从机&#xff08;AHB Slave&#xff09; &#xff08;3&#xff09;AHB 仲裁…

基础论文学习(1)——ViT

https://zhuanlan.zhihu.com/p/308301901 1 图片分块和降维 因为transformer encoder的输入需要序列&#xff0c;所以最简单做法就是把图片切分为patch&#xff0c;然后拉成序列即可。 假设输入图片大小是256x256&#xff0c;打算分成64个patch&#xff0c;每个patch是32x32…