当前位置: 首页 > news >正文

【C++】B2122 单词翻转


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
  • 💯一、我的做法
    • 代码实现:
    • 代码解析
    • 思路分析
  • 💯二、老师的第一种做法
    • 代码实现:
    • 代码解析
    • 思路分析
  • 💯三、C++ `reverse` 函数介绍
    • `reverse` 函数原型:
    • 示例:
    • 优点
  • 💯四、老师的第二种做法:使用 `reverse` 函数
    • 代码实现:
    • 代码解析
    • 思路分析
  • 💯五、对比分析
  • 💯六、拓展
  • 💯小结
    • 最开始的解法不通过
    • 老师优化后通过


在这里插入图片描述


💯前言

  • 在计算机科学中,字符串处理是一个非常基础且常见的任务。本题主要围绕如何将一个句子中的每个单词反转来进行练习。这个问题不仅考察了对字符串操作的理解,还涉及了不同的解决方法。在本篇文章中,我们将详细探讨我自己的做法、老师提出的两种做法,并深入讲解C++中 reverse 函数的使用,最后通过对比和拓展分析这些方法的优缺点。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

B2122 单词翻转
在这里插入图片描述

小明同学写单词的时候喜欢反着写,比如 hello 他会写成 olleh。给出小明同学写的一个句子,请你将所有的单词复原。

输入格式

共一行,一个字符串表示句子,单词之间以空格分隔。

输出格式

每个单词一行。

样例 #1

样例输入 #1

olleh dlrow

样例输出 #1

hello
world

💯一、我的做法

代码实现:

#include <iostream>
#include <string>
using namespace std;int main()
{string s;while(cin >> s){for(int i = s.size() - 1; i >= 0; i--){cout << s[i];}cout << endl;}return 0;
}

代码解析

在这个实现中,我选择了通过手动反转每个单词的字符来恢复正确的单词顺序。

  1. 变量声明

    • string s;:声明一个字符串变量 s 用于存储从输入中读取的每个单词。
  2. 读取输入

    • while(cin >> s):使用 cin >> s 读取一个单词,直到没有更多输入。
  3. 反转每个单词

    • for(int i = s.size() - 1; i >= 0; i--):我们使用一个从单词末尾到开头的 for 循环,通过访问每个字符并逆序输出,来实现反转操作。
  4. 输出每个单词

    • cout << s[i];:逐个输出反转后的字符。
  5. 换行

    • 每个单词输出后,使用 cout << endl; 换行,确保每个单词占一行。

思路分析

这段代码通过遍历每个字符并从末尾到开头进行输出来实现反转。通过这种手动操作字符的方式,能够准确地完成任务。它的优点是直接且易于理解,但缺点是代码稍显冗长,且没有利用C++标准库提供的便捷工具。


💯二、老师的第一种做法

老师给出的第一种做法是通过手动交换字符串中的字符来反转单词。下面是老师的代码实现:

代码实现:

#include <iostream>
#include <cstring>
using namespace std;int main()
{string str;while(cin >> str){int left = 0;int right = str.size() - 1;while(left < right){char tmp = str[left];str[left] = str[right];str[right] = tmp;left++;right--;}cout << str << endl;}return 0;
}

代码解析

老师的做法同样采用了字符交换的方式来反转每个单词。其关键点在于通过两个指针从字符串的两端向中间移动,交换字符,直到完成反转。

  1. 初始化两个指针

    • int left = 0; int right = str.size() - 1;leftright 分别是指向字符串开始和结束的两个指针。
  2. 交换字符

    • char tmp = str[left]; str[left] = str[right]; str[right] = tmp;:通过一个临时变量 tmp 来交换 str[left]str[right]
  3. 逐步移动指针

    • left++right--:交换后,left 指针向右移动,right 指针向左移动,逐步将字符串反转。
  4. 输出反转后的字符串

    • cout << str << endl;:输出反转后的单词。

思路分析

老师的做法通过交换字符来反转字符串,使用了双指针的技巧,这种方法比我的做法更具效率,因为它只需要一次遍历,每次只交换两个字符。相比手动逐个输出字符,这种方法更符合常见的反转思路,代码更简洁。


💯三、C++ reverse 函数介绍

在C++标准库中,提供了一个名为 reverse 的函数,它可以轻松地反转一个容器(例如字符串、数组等)的元素顺序。该函数位于 <algorithm> 头文件中,使用时非常方便。

reverse 函数原型:

void reverse(BidirectionalIterator first, BidirectionalIterator last);
  • first:指向待反转区间的起始元素的迭代器。
  • last:指向待反转区间的结束元素的迭代器。

该函数会反转区间 [first, last) 中的元素。

示例:

string s = "abcd";
reverse(s.begin(), s.end());
cout << s << endl; // 输出 "dcba"

优点

  • 简洁:C++ reverse 函数将反转操作封装得非常简洁。只需调用一次 reverse,就能完成字符串或数组的反转,代码更加清晰易懂。
  • 高效reverse 内部实现通常采用类似于双指针交换的方式,性能非常高。

💯四、老师的第二种做法:使用 reverse 函数

老师的第二种做法直接利用了 C++ STL 中的 reverse 函数,这使得反转操作变得更加简便。

代码实现:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;int main()
{string str;while (cin >> str){reverse(str.begin(), str.end());cout << str << endl;}return 0;
}

代码解析

这段代码通过 reverse 函数反转字符串:

  1. 使用 reverse 函数

    • reverse(str.begin(), str.end());:直接使用 reverse 函数来反转字符串 str
  2. 输出反转后的字符串

    • cout << str << endl;:输出每个反转后的单词,并换行。

思路分析

这种做法通过使用 C++ STL 中的现成函数来简化代码。reverse 函数提供了高效且简洁的反转操作,比手动交换字符或逐个输出字符的方法要简单得多。


💯五、对比分析

  1. 我的做法

    • 优点:代码简单,容易理解,适用于初学者。
    • 缺点:冗长,效率较低,特别是手动反转每个字符时,不够高效。
  2. 老师的第一种做法

    • 优点:通过双指针交换字符,比手动输出字符更高效。
    • 缺点:代码较为复杂,理解起来可能稍微困难。
  3. 老师的第二种做法

    • 优点:使用 reverse 函数,代码最简洁,符合C++的标准库优势,效率高。
    • 缺点:可能需要对 reverse 函数有一定的了解。

💯六、拓展

除了 reverse 函数外,我们还可以用其他方式来处理字符串或数组的反转操作:

  1. 利用栈:将字符压入栈中,然后从栈中弹出字符来实现反转。
  2. 递归:通过递归函数逐步将字符串或数组的字符进行反转。

💯小结

通过对比不同的做法,我们可以看到,C++提供了多种有效的反转策略。通过手动字符交换、使用 reverse 函数,甚至使用 STL 容器的其他方法,我们可以灵活地选择最适合问题需求的解决方案。在实际开发中,选择合适的工具和方法,不仅能提高代码的可读性,还能提高程序的效率。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

最开始的解法不通过

#include <iostream>
#include <string>
using namespace std;int main()
{string s;getline(cin, s);int i = 0;int index = 0;for(i = 0; i < s.size(); i++){if(s[i] == ' '){for(int j = i - 1; j >= index; j--)cout << s[j];cout << endl;index = i + 1;	}else if(i == s.size() - 1){for(int j = i; j >= index; j--)cout << s[j];cout << endl;}	} return 0;
}

在这里插入图片描述

老师优化后通过

#include <iostream>
#include <string>
using namespace std;int main()
{string s;getline(cin, s);int i = 0;int index = 0;for (i = 0; i < s.size() - 1; i++){if (s[i] == ' '){for (int j = i - 1; j >= index; j--){cout << s[j];}cout << endl;index = i + 1;}else if (i == s.size() - 2){for (int j = i; j >= index; j--){cout << s[j];}cout << endl;}}return 0;
}

相关文章:

【C++】B2122 单词翻转

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 &#x1f4af;一、我的做法代码实现&#xff1a;代码解析思路分析 &#x1f4af;二、老师的第一种做法代码实现&a…...

OSCP 渗透测试:网络抓包工具的使用指南

在 OSCP 考试和渗透测试中&#xff0c;网络数据分析是至关重要的技能。无论是嗅探明文密码、分析恶意流量&#xff0c;还是溯源攻击&#xff0c;抓包工具都是我们的得力助手。 本文将介绍 OSI 七层网络模型 及其在网络分析中的作用&#xff0c;并详细讲解 Wireshark 和 tcpdum…...

Android 进程间通信

什么是IPC&#xff1f; Android 进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;是Android操作系统中不同进程间交换数据和资源的一种机制。由于Android是多任务操作系统&#xff0c;每个应用通常运行在自己的进程中&#xff0c;以提高安全性和…...

Kubernetes学习之通过Service访问Pod

一、基础概述 1.当通过deployment等controller动态创建和销毁pod使得每个pod都有自己的ip地址&#xff0c;当controller用新的pod替代发生故障的pod时&#xff0c;新的pod会分配到新的ip地址&#xff0c;那么客户端如何稳定的找到并访问pod提供的服务。 2.创建service service从…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.18 对象数组:在NumPy中存储Python对象

2.18 对象数组&#xff1a;在NumPy中存储Python对象 目录 #mermaid-svg-shERrGOBuM2rBzeB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-shERrGOBuM2rBzeB .error-icon{fill:#552222;}#mermaid-svg-shERrGOBuM2rB…...

Web - CSS3基础语法与盒模型

概述 这篇文章是关于 Web 前端 CSS3 的基础语法与盒模型的讲解。包括 CSS3 层叠性及处理冲突规则、伪元素和新增伪类元素、属性选择器等。还介绍了文本与字体属性&#xff0c;如段落和行相关属性、字体文本属性。最后阐述了盒子模型&#xff0c;如元素隐藏、行内与块元素转换、…...

CSS知识总结

CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种用于描述网页内容视觉表现的样式语言&#xff0c;与HTML&#xff08;结构&#xff09;和JavaScript&#xff08;行为&#xff09;共同构成现代Web开发的三大核心技术。 一、基本概念 定义&…...

基于Spring Security 6的OAuth2 系列之十 - 授权服务器--刷新token

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…...

信息学奥赛一本通 2113:【24CSPJ普及组】小木棍(sticks) | 洛谷 P11229 [CSP-J 2024] 小木棍

【题目链接】 ybt 2113&#xff1a;【24CSPJ普及组】小木棍&#xff08;sticks&#xff09; 洛谷 P11229 [CSP-J 2024] 小木棍 【题目考点】 1. 思维题&#xff0c;找规律 【解题思路】 解法1&#xff1a;找规律 该题为&#xff1a;求n根木棍组成的无前导0的所有可能的数…...

安装hami的笔记

k3s环境下安装hami提示如下错误&#xff1a; "failed to “StartContainer” for “kube-scheduler” with InvalidImageName: "Failed to apply default image tag “registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.31.2k3s1”: 没有Inva…...

【区块链】区块链密码学基础

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 区块链密码学基础引言一、哈希函数1.1 基本概念1.2 数学表达 二、非对称加密2.1…...

强化学习笔记(5)——PPO

PPO视频课程来源 首先理解采样期望的转换 变量x在p(x)分布下&#xff0c;函数f(x)的期望 等于f(x)乘以对应出现概率p(x)的累加 经过转换后变成 x在q(x)分布下&#xff0c;f(x)*p(x)/q(x) 的期望。 起因是&#xff1a;求最大化回报的期望&#xff0c;所以对ceta求梯度 具体举例…...

【C语言入门】解锁核心关键字的终极奥秘与实战应用(三)

目录 一、auto 1.1. 作用 1.2. 特性 1.3. 代码示例 二、register 2.1. 作用 2.2. 特性 2.3. 代码示例 三、static 3.1. 修饰局部变量 3.2. 修饰全局变量 3.3. 修饰函数 四、extern 4.1. 作用 4.2. 特性 4.3. 代码示例 五、volatile 5.1. 作用 5.2. 代码示例…...

寒假day10

第十天&#xff1a;请写出以下几个数据的类型 整数 a int a的地址 int* 存放a的数组b …...

本地部署与使用SenseVoice语音大模型简析

前言 SenseVoice 是一种语音基础模型&#xff0c;具有多种语音理解功能&#xff0c;包括自动语音识别 (ASR)、口语识别 (LID)、语音情感识别 (SER) 和音频事件检测 (AED)。本博客将指导您安装和使用 SenseVoice 模型&#xff0c;使其尽可能方便用户使用。 Github 仓库链接: ht…...

Kafka SASL/SCRAM介绍

文章目录 Kafka SASL/SCRAM介绍1. SASL/SCRAM 认证机制2. SASL/SCRAM 认证工作原理2.1 SCRAM 认证原理2.1.1 密码存储和加盐2.1.2 SCRAM 认证流程 2.2 SCRAM 认证的关键算法2.3 SCRAM 密码存储2.4 SCRAM 密码管理 3. 配置和使用 Kafka SASL/SCRAM3.1 Kafka 服务器端配置3.2 创建…...

中间件漏洞之CVE-2024-53677

目录 什么是struts&#xff1f;CVE-2024-53677简介影响版本复现环境搭建漏洞利用修复 什么是struts&#xff1f; 在早期的 Java Web 开发中&#xff0c;代码往往混乱不堪&#xff0c;难以维护和扩展。比如&#xff0c;一个简单的用户登录功能&#xff0c;可能在不同的 Java 类…...

pytorch基于 Transformer 预训练模型的方法实现词嵌入(tiansz/bert-base-chinese)

以下是一个完整的词嵌入&#xff08;Word Embedding&#xff09;示例代码&#xff0c;使用 modelscope 下载 tiansz/bert-base-chinese 模型&#xff0c;并通过 transformers 加载模型&#xff0c;获取中文句子的词嵌入。 from modelscope.hub.snapshot_download import snaps…...

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …...

区间覆盖问题

文章目录 1. 题面2. 简单分析3. 代码解答4. TLE的2点可能 1. 题面 给定 N N N个区间 [ a i , b i ] [a_i,b_i] [ai​,bi​] 以及一个区间 [ s , t ] [s,t] [s,t]&#xff0c;请你选择尽量少的区间&#xff0c;将指定区间完全覆盖。 输出最少区间数&#xff0c;如果无法完全…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...