【C++】有关string迭代器的几道OJ题详解
目录
一、字符串最后一个单词的长度
题目描述
完整代码
二、验证回文串
题目描述
完整代码
三、反转字符串
题目描述
完整代码
四、反转字符串中的单词
题目描述
完整代码
一、字符串最后一个单词的长度
原题链接
题目描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
按照题目要求,我们需要找到字符串中的最后一个单词,我的想法是从字符串的最后一个字符开始向前遍历,直到遇到空格为止,那么怎么实现遍历呢,我们可以用迭代器指向最后一个字符,这里用到一个string的成员函数 rbegin() 它的作用是创建一个指向字符串最后一个字符的反向迭代器,我们创建一个 it 变量用于接受迭代器的内容。
由于声明一个迭代器类型比较麻烦,因为类型名字通常比较长,所以可以用到auto关键字对 it 进行定义:auto it = input::rbegin() 。此时对it进行 * 解引用就可以获取当前指向的字符,这样就可以实现对字符的判空,迭代器it++则指向它之前的字符。了解了这些,我们就可以做题了。
不过还有一个问题,题目要求的并不是接口实现,需要我们自行存储输入样例,但是用cin输入字符串时,编译器遇到空格就停止,也就是说怎么存储一个带有多个空格的字符串成了问题。这里可以用C++标准库的getline函数,用于从输入流(例如std::cin
)中读取一行文本。下面是它的标准用法:
std::getline(input_stream, str, delimiter);
完整代码
#include <iostream>
#include<string>
using namespace std;int main() {string input;getline(cin, input);int answer = 0;for (auto it = input.rbegin(); *it != ' '; it++) {answer++;if (answer >= input.size()) {cout << input.size();return 0;}}cout << answer << endl;
}
二、验证回文串
原题链接
题目描述
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串
s
,如果它是 回文串 ,返回true
;否则,返回false
。示例 1:
输入: s = "A man, a plan, a canal: Panama" 输出:true 解释:"amanaplanacanalpanama" 是回文串。示例 2:
输入:s = "race a car" 输出:false 解释:"raceacar" 不是回文串。示例 3:
输入:s = " " 输出:true 解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。 由于空字符串正着反着读都一样,所以是回文串。
按题目要求,我们需要对字符串从前往后以及从后往前分别遍历,判断两次遍历内容是否相同,观察实例可以发现,字符无关大小写,所以我们需要统一字符的大小写,这里统一成小写,这里用到C++标准库函数 tolower,用于将字符串转化成小写形式。其原型如下:
int tolower(int c);
该函数接受一个整数参数 c
,该参数代表一个字符。如果该字符是大写字母,则 tolower
返回相应的小写字母的ASCII码值;否则,它原样返回。再通过基于范围的for循环来对字符串每个字符进行遍历并对其进行修改。
大小写的问题解决了,但是字符串还要再进行进一步的处理,根据例题,回文串是不考虑标点符号和空格的,所以,我们还需要把字符串中空格和标点的部分进行删除,只保留字母部分,下面先给出这一部分的代码:
s.erase(std::remove_if(s.begin(), s.end(), [](char c) {return std::ispunct(c) || std::isspace(c);}),s.end()
);
-
std::remove_if
: 这个函数用于对指定范围内的元素进行重新排列,使满足给定谓词条件(由 lambda 函数指定)的元素移到范围的末尾。它实际上并不删除元素,只是将它们移到末尾。 -
Lambda 函数
[](char c) { return std::ispunct(c) || std::isspace(c); }
是一个谓词,对于是标点符号或空格字符的字符返回true
。 -
std::remove_if
的结果作为第一个参数传递给s.erase
函数,该函数用于从字符串中擦除指定范围的元素。
经过上述步骤,字符串就处理完成了,接下来就是对字符串分别进行先序和后序遍历,通过定义两个个string对象,分别讲先序和后序的结果赋值给他们,然后进行比较。
完整代码
class Solution {
public:bool isPalindrome(string s) {for (char& x : s) { //大写转小写x = tolower(x);}s.erase(remove_if(s.begin(), s.end(), [](char c) { //删去标点符与空格符return std::ispunct(c) || std::isspace(c); }), s.end());string a1(s.begin(), s.end());string a2(s.rbegin(), s.rend());if (a1 == a2) {return 1;}return 0;}
};
三、反转字符串
原题链接
题目描述
给定一个字符串
s
和一个整数k
,从字符串开头算起,每计数至2k
个字符,就反转这2k
字符中的前k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。- 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
根据题目要求,首先需要遍历字符串,我们用一个迭代器来实现遍历,还需要记录遍历的个数,用flag表示当遍历了2k个字符时,对前k个进行翻转,翻转的操作我们可以通过库函数 reverse 实现,每进行一次翻转操作后,将flag置0。
完整代码
class Solution {
public:string reverseStr(string s, int k) { //翻转前2k个字符的前k个字符int flag = 0;auto begin = s.begin();for (auto x = s.begin(); x != s.end(); x++) {flag++;if (flag == 2 * k) {reverse(begin, x+1-k);begin = x + 1;flag = 0;}}if (flag < k) {reverse(begin, s.end());}else {reverse(begin, begin + k);}return s;}
};
为什么这里reverse内的参数是begin和x+1-k呢,原因是reverse内部第二个迭代器参数其实指向的是字符串最后一个元素的后一位,而x此时指向的是2k个元素中的第2k个元素,所以需要+1再-k,才能实现对前k个元素的翻转。
四、反转字符串中的单词
原题链接
题目描述
给定一个字符串
s
,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例 1:
输入:s = "Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc"示例 2:
输入: s = "Mr Ding" 输出:"rM gniD"
这道题目与上一道类似,只不过翻转的范围变成了字符串中的每个单词,那么只需要通过遍历找到空格的位置,即上一道题目找到第2k个位置类似,然后进行翻转,同样需要flag来标记遍历的个数以及一个left迭代器标记遍历的起始位置。
完整代码
class Solution {
public:string reverseWords(string s) {auto left = s.begin();for (auto right = s.begin(); right != s.end(); right++){if (*right == ' ') { //碰到空格,开始翻转reverse(left, right);left = right + 1;}}reverse(left, s.end());return s;}
};
这四道题目考验了有关迭代器,string以及部分库函数的知识点,通过这四道例题,我们可以对迭代器的运用有更深入的了解。
相关文章:
【C++】有关string迭代器的几道OJ题详解
目录 一、字符串最后一个单词的长度 题目描述 完整代码 二、验证回文串 题目描述 完整代码 三、反转字符串 题目描述 完整代码 四、反转字符串中的单词 题目描述 完整代码 一、字符串最后一个单词的长度 原题链接 题目描述 计算字符串最后一个单词的长度ÿ…...

谷歌宣布向云计算客户开放 Gemini Pro,开发者可用其构建应用
12 月 14 日消息,美国时间周三,谷歌宣布了一系列升级的人工智能(AI)功能,旨在为其云计算客户提供更好的服务。这家科技巨头正试图赶上竞争对手,比如微软和 OpenAI,它们都在积极利用人工智能的热…...

软件测试用例经典方法 | 单元测试法案例
单元测试又称模块测试,是对软件设计的最小单元的功能、性能、接口和设计约束等的正确性进行检验,检查程序在语法、格式和逻辑上的错误,并验证程序是否符合规范,以发现单元内部可能存在的各种缺陷。 单元测试的对象是软件设计的最…...
Leetcode 2967. Minimum Cost to Make Array Equalindromic
Leetcode 2967. Minimum Cost to Make Array Equalindromic 1. 解题思路2. 代码实现 题目链接:2967. Minimum Cost to Make Array Equalindromic 1. 解题思路 这一题其实我的思路有点笨,多少有点暴力求解的意思。 显然,如果我们给出全部的…...

【数据结构】什么是堆?
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 堆的概念及结构 堆的定义如下: n个元素的序列{k1,k2,...,kn}当且仅当满足以下关系时,称之为堆. 或 把这个序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个…...

生产环境_Spark处理轨迹中跨越本初子午线的经度列
使用spark处理数据集,解决gis轨迹点在地图上跨本初子午线的问题,这个问题很复杂,先补充一版我写的 import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.sql.{Row, SparkSession} import org.apache.spark.sql.func…...

Vue前端与后端放在一起的搭建方式
1.首先把后端项目搭建好 去到项目的存放位置 2.然后cmd黑窗口输入命令创建vue项目 3.创建成功后回到后端项目进行合并 3.1在File处选择Project Structure 3.2选择模块 3.3找到自己的vue项目 3.4疯狂next最后create 3.5选择Apply并确定OK,恭喜您创建成功了 二、启动…...

SI24R03国产自主可控RISC-V架构MCU低功耗2.4GHz收发芯片SoC
目录 RISC-V架构的优势SI24R03/04特性射频收发器模块特征MCU 模块特征 其他特征 RISC-V架构的优势 相对于目前主流的英特尔X86架构及ARM等架构来说,RISC-V架构具有指令精简、模块化、可扩展、开源、免费等优点。RISC-V的基础指令集只有40多条,加上其他基…...

基于FPGA的温度控制系统设计(论文+源码)
1.系统设计 本次基于FPGA的智能温度控制系统,以FPGA为控制核心,采用自顶向下的设计方法,按照模块化设计的思路分别实现各个模块,再加以整合实现整个系统,从而达到了温度控制的目的。系统以水箱为被控对象,…...

C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数
目录 一、编写程序,输入三个字符串,比较它们的大小,并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用,并用指向函数的指针作为函数的参数。 1.不使用函数指针作为参数,并自己模拟strcmp。 …...

module ‘tensorflow‘ has no attribute XXX 报错解决
问题描述: 粘了别人的tensorflow项目,运行总是报错module ‘tensorflow’ has no attribute什么什么 问题解决: 导入tensorflow的代码如下 import tensorflow as tf此时,某个某块报错,比如下面这个 那么就直接把tf.…...

MySQL数据库 DDL
目录 一、DDL 二、操作数据库 三、操作表 四、数据类型 五、表操作案例 六、修改表 七、删除表 一、DDL Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) 。 二、操作数据库 (1&am…...

力扣二叉树--总结篇(2)
前言 总体回顾:11.18-12.14,中间有一个星期左右因为考试没有写题。37道题。 内容 这是第二阶段刷的题 从路径到构造二叉树,合并二叉树,再到二叉搜索树,公共祖先问题 看到二叉树,看到递归 都会想&#…...

小米移动端页面练习---重点:导航栏点击下箭头内容的切换以及样式,高亮显示的实现
效果图 1.html <div><header><div class"header-ad"><img src"./images/ad.png" alt"" srcset""></div><div class"header-two-section"><div class"logo"><div c…...

从零开始创建一个项目,springBoot+mybatisPlus+mysql+swagger+maven
一,前提 从零开始创建一个项目,绑定了数据库 用到的技术栈:springBootmybatisPlusmysqlswaggermaven 二,创建项目步骤 1,创建项目 创建出来的项目结构如图所示 2,修改配置文件 因为我比较习惯yml语言&…...
【视点合成】代码解读:生成demo视频
变换工具 def render_3dphoto(src_imgs, # 输入的源图像,维度为 [batch_size, 3, height, width]mpi_all_src, # 输入的所有源图像的MPI,维度为 [batch_size, num_planes, 4, height, width]disparity_all_src, # 所有源图像的视差信息&…...

Process On在线绘制流程图
目录 一.ProcessOn 1.1.介绍 1.2.直接网上使用 二.绘制门诊流程图 三.绘制住院流程图 四.绘制药库采购入库流程图 五.绘制OA会议流程图 今天就到这里了哦!!!希望能帮到你哦!!! 一.ProcessOn 1.1.介绍 ProcessOn(流程&#…...
【Hadoop-OBS-Hive】利用华为云存储对象 OBS 作为两个集群的中间栈 load 文件到 Hive
【Hadoop-OBS-Hive】利用华为云存储对象 OBS 作为两个集群的中间栈 load 文件到 Hive 1)压缩文件2)上传文件到 OBS 存储对象3)crontab 定时压缩上传4)从 obs 上拉取下来文件后解压缩5)判断对应文件是否存在6࿰…...
直线检测算子
hough_lines_dir 接口 hough_lines_dir(ImageDir : HoughImage, Lines : DirectionUncertainty, AngleResolution, Smoothing, FilterSize, Threshold, AngleGap, DistGap, GenLines : Angle, Dist) 参数 in: ImageDir :由边缘检测算子sobel_dir、edge_image获取的…...

如何在本地Docker中部署MinIO服务并实现远程访问管理界面
文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
SQL进阶之旅 Day 22:批处理与游标优化
【SQL进阶之旅 Day 22】批处理与游标优化 文章简述(300字左右) 在数据库开发中,面对大量数据的处理任务时,单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”,深入探讨如何通过批量操作和游标技术提…...

react更新页面数据,操作页面,双向数据绑定
// 路由不是组件的直接跳转use client,useEffect,useRouter,需3个结合, use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...

SpringSecurity+vue通用权限系统
SpringSecurityvue通用权限系统 采用主流的技术栈实现,Mysql数据库,SpringBoot2Mybatis Plus后端,redis缓存,安全框架 SpringSecurity ,Vue3.2Element Plus实现后台管理。基于JWT技术实现前后端分离。项目开发同时采 …...