当前位置: 首页 > 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;如果无法完全…...

开源智能设备开发指南:从技术原理到实战应用

开源智能设备开发指南&#xff1a;从技术原理到实战应用 【免费下载链接】xiaozhi-esp32 Build your own AI friend 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 开源智能设备开发正成为物联网创新的核心驱动力&#xff0c;通过边缘计算优化与跨平…...

HarmonyOS文件流操作指南:用ArkTS实现高效大文件传输与哈希校验

HarmonyOS文件流操作实战&#xff1a;ArkTS实现大文件传输与完整性校验 在移动应用开发中&#xff0c;文件操作是基础但至关重要的功能。当应用需要处理大型媒体文件、数据库备份或批量数据交换时&#xff0c;传统的文件IO方式往往力不从心。HarmonyOS提供的流式文件操作接口&a…...

企业级大数据产品架构设计指南

企业级大数据产品架构设计指南&#xff1a;从概念到落地的完整方案 标题选项 企业级大数据架构设计全攻略&#xff1a;从0到1构建可扩展的数据平台大数据产品架构设计指南&#xff1a;如何打造高性能、高可用的企业级解决方案从理论到实践&#xff1a;企业级大数据产品架构设计…...

【UE5】深入解析Dedicated Server专用服务器的网络同步机制与实战优化

1. UE5专用服务器基础概念解析 第一次接触UE5专用服务器(Dedicated Server)时&#xff0c;我完全被各种专业术语绕晕了。经过几个项目的实战后&#xff0c;我发现理解它的本质其实很简单——就像餐厅里的服务员与顾客的关系。服务器就是那个永远在后台忙碌的服务员&#xff0c;…...

Matrix Motor Extension:四通道嵌入式电机驱动模块详解

1. 项目概述Matrix Motor Extension 是一款面向嵌入式控制场景的四通道直流电机驱动扩展模块&#xff0c;专为需要多轴独立运动控制的智能硬件平台设计。其核心定位并非通用型电机驱动板&#xff0c;而是作为主控系统&#xff08;如 STM32、ESP32、Raspberry Pi Pico 等&#x…...

网易云音乐评论爬虫实战:破解加密接口抓取数据

一、接口分析&#xff1a;找准评论数据请求入口 在抓取网易云音乐歌曲评论时&#xff0c;我们不难发现&#xff0c;页面并不会随着翻页刷新跳转&#xff0c;评论的加载属于异步AJAX请求。这类接口有一个明显特点&#xff1a;接口地址固定不变&#xff0c;分页切换完全依靠请求载…...

Python AI用例生成效率提升300%:从零搭建可复用的Prompt工程流水线

第一章&#xff1a;Python AI用例生成效率提升300%&#xff1a;从零搭建可复用的Prompt工程流水线在AI应用开发中&#xff0c;重复编写、调试和验证Prompt严重拖慢用例迭代速度。本章介绍一种基于Python的轻量级Prompt工程流水线&#xff0c;通过模板化、版本化与自动化执行三重…...

FastAPI速率限制:Redis分布式实现的终极指南

FastAPI速率限制&#xff1a;Redis分布式实现的终极指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI作为高性能的现代Web框…...

告别纸上谈兵:用Wireshark抓包实战分析FlexRay帧格式(含CRC校验)

实战解析FlexRay帧格式&#xff1a;用Wireshark抓包验证CRC与网络管理向量 车载工程师们常遇到这样的困境&#xff1a;明明熟读FlexRay协议文档&#xff0c;面对真实总线数据时却无从下手。本文将带您用Wireshark完成从抓包到解析的全流程实战&#xff0c;重点破解Header CRC校…...

ai赋能安装:让快马生成智能交互式mysql安装故障排查助手

AI赋能安装&#xff1a;让快马生成智能交互式MySQL安装故障排查助手 MySQL作为最流行的开源数据库之一&#xff0c;安装过程看似简单&#xff0c;但实际会遇到各种"坑"。新手经常被报错信息搞得一头雾水&#xff0c;老手也可能在特定环境下翻车。传统教程都是静态的…...