【C++_string类练习】仅仅反转字母

题目链接:仅仅反转字母


解题思路:

这种反转字符的题目我第一个想到的方法就是:双指针

一个指针在前start,一个指针在后back,

如果指针所指向的位置的值是字母,那么两个指针位置的值就进行交换,

如果不是,则该指针就往下走一位,直到所指向的位置的值是字母。

ok思路有了,现在的问题就是:

1.怎么表示前后两个指针

2.怎么让这两个指针动起来?什么时候又停下?

3.用什么方法来判断该位置是不是字母?

好,我们一个一个来看:

第一个问题:怎么表示前后两个指针

看过我【C++】String类这篇文章的都知道,访问string我们有三种方式:

1.[ ]+下标

2.迭代器

3.范围for

既然我们想要表示string的前后两个位置,我这里选择的是迭代器:

string::iterator start = s.begin();
string::iterator back = s.end()-1;

注意begin和end是左闭右开区间[……),所以back这里要减1才能指向最后一个位置。

2.怎么让这两个指针动起来?什么时候又停下?

我们可以用while循环,start++,back--

同时要保持start<back

3.用什么方法来判断该位置是不是字母?

可以用isalpha函数来判断,

isalpha 函数是一个标准库函数,用于检查给定的字符是否是字母。

  • 如果 c 是一个字母(大写或小写),则返回非零值(通常是 1)。
  • 如果 c 不是字母,则返回 0

拓展:

但是,它有个要求,就是它希望我们给它的字符对应的数字要是0到255之间的,这样它才能正确地判断。

问题来了,如果我们直接给一个字符给isalpha,而这个字符对应的数字在ASCII编码里是负数(因为char类型在有些电脑里是可以表示负数的),那么isalpha就可能会出错,因为它不认识这个负数对应的字符是什么。

所以,为了避免这个问题,我们要先把这个字符转换成一个无符号的数字,确保它是0到255之间的。这就是static_cast<unsigned char>(*back)的作用。它就像是一个翻译,把有符号的字符翻译成无符号的数字,这样isalpha就能正确地识别字符了。

当然,这道题,不用加static_cast<unsigned char>(*back)也行

while (start < back){while(start < back&&(!isalpha(static_cast<unsigned char>(*start))))start++;while (start < back&&(!isalpha(static_cast<unsigned char>(*back))))back--;swap(*start, *back);start++;back--;}

所以整体代码为:

class Solution {
public:string reverseOnlyLetters(string s) {string::iterator start = s.begin();string::iterator back = s.end()-1;while (start < back){while(start < back&&(!isalpha(static_cast<unsigned char>(*start))))start++;while (start < back&&(!isalpha(static_cast<unsigned char>(*back))))back--;swap(*start, *back);start++;back--;}return s;
};};

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

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

相关文章

矿山企业电能智能化管理怎么实现

0引言 电力工业是国民经济和社会发展的基础&#xff0c;随着高质量发展要求的提升&#xff0c;提高能源效率对工业企业至关重要。有效提高电力能效的方法包括技术创新、监测用能行为和探索技术解决方案。智能化的电能管理是应对资源和环境压力的关键措施&#xff0c;对提高用电…

点餐小程序实战教程20广告管理

目录 1 创建数据源2 添加轮播容器3 创建变量4 绑定变量5 预览应用总结 一般餐厅需要有一些宣传&#xff0c;在我们的点餐页面可以在顶部加载广告位。广告主要是用轮播图的形式进行展示&#xff0c;本节我们介绍一下如果显示广告。 1 创建数据源 打开控制台&#xff0c;点击应用…

10-Docker安装Redis

10-Docker安装Redis Docker安装Redis 以 Redis 6.0.8 为例&#xff1a; docker pull redis:6.0.8直接pull会出现以下错误 [rootdocker ~]# docker pull redis:6.0.8 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request can…

ubuntu安装docker及docker compose

在Ubuntu上安装Docker通常包括以下几个步骤&#xff1a; 更新包索引&#xff1a; 打开终端并运行以下命令来更新你的包索引&#xff1a; sudo apt update安装必要的依赖&#xff1a; 安装apt-transport-https、ca-certificates、curl、software-properties-common、gnupg等软件…

Java基础-8新特性

Lambda 表达式 Lambda 表达式&#xff0c;也可称为闭包。Lambda 表达式是一个匿名函数&#xff0c;我们可以这样理解 Lambda 表达式&#xff1a;Lambda 是一段可以传递的代码&#xff08;能够做到将代码像数据一样进行传递&#xff09;。格式如下&#xff1a; (parameters) -&g…

【Cadence27】HDL拷贝工程➕Allegro导出DXF和3D文件STP

【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办&#xff1f; 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…

【入门篇】2.8 时钟(三)

目录 5.3.1 配置时钟源相关参数:调用函数 HAL_RCC_OscConfig() 5.3.2 配置系统时钟源以及 SYSCLK、AHB、APB1 和 APB2 的分频系数:调用函数HAL_RCC_ClockConfig() 六,STM32F4 时钟使能和配置 6.1 使能时钟 6.2 禁用时钟 5.3.1 配置时钟源相关参数:调用函数 HAL_RCC_Os…

【力扣 | SQL题 | 每日4题】力扣2308,2324,2346,2372

4 mid&#xff0c;还是比较常规的。 1. 力扣2308&#xff1a;按性别排列表格 1.1 题目&#xff1a; 表: Genders ---------------------- | Column Name | Type | ---------------------- | user_id | int | | gender | varchar | ---------------------- u…

卸载 Git

目录 打开 Geek找到 Git右键卸载 Git卸载完成等待扫描注册表点击完成清除Git在本地的配置文件 打开 Geek 找到 Git 右键卸载 Git 卸载完成 等待扫描注册表 点击完成 已经删除完毕 清除Git在本地的配置文件 进入 C:\Users\用户名 删除框起来的配置文件 &#x1f447; 源码资料…

Map转Map

将一个Map<String,Integer> 转换成Map<String,String> //创建一个创建Map的公共方法 private static <T> Map<String,T> newMap(String key,T val,Object...kv){Map<String,T> ans new HashMap<>(8);ans.put(key,val);for(int i0,size k…

webpack自定义插件 ChangeScriptSrcPlugin

插件文件 class ChangeScriptSrcPlugin {apply(compiler) {const pluginName "ChangeScriptSrcPlugin";compiler.hooks.compilation.tap(pluginName, (compilation, callback) > {compilation.hooks.htmlWebpackPluginAlterAssetTags.tapAsync(pluginName,(html…

DES对称加密算法

DES&#xff08;Data Encryption Standard&#xff0c;数据加密标准&#xff09;是一种对称加密算法。 算法概述 加密类型&#xff1a;对称加密&#xff08;同一密钥用于加密和解密&#xff09;。密钥长度&#xff1a;64位&#xff08;8字节&#xff09;&#xff0c;其中有效…

java--网络编程

网络的相关概念 网络通信 1.概念:两台设备之间通过网络实现数据传输2.网络通信:将数据通过网络从一台设备传输到另一台设备3.java.net包下提供了一系列的类或接口&#xff0c;供程序员使用&#xff0c;完成网络通信 网络 概念&#xff1a;两台或多台设备通过一定物理设备连接…

UltraISO(软碟通)制作U盘制作Ubuntu20.04启动盘

目录 一、启动盘制作 1、工具准备 2、打开UltraISO后&#xff0c;点击左上角的文件&#xff0c;在打开的下拉项中&#xff0c;选择打开准备好的Ubuntu系统20.04 LTS镜像文件(ubuntu-20.04-desktop-amd64.iso)&#xff1b; 3、然后点击启动->写入硬盘映像 4、在弹出的窗…

Pollard‘s p-1算法

概述 光滑数 (Smooth number)&#xff1a;指可以分解为多个小素数乘积的正整数 当p是N 的因数&#xff0c;并且p−1是光滑数&#xff0c;可以考虑使用Pollards p-1算法来分解N 当p是N的因数&#xff0c;并且p1是光滑数&#xff0c;可以考虑使用Williamss p1算法来分解N 这里…

11.useComponentDidMount

在 React 的函数组件中,有时我们需要在组件首次挂载后执行某些操作,这在类组件中通常通过 componentDidMount 生命周期方法来实现。useComponentDidMount 钩子提供了一种简洁的方式来在函数组件中实现相同的功能。这个自定义钩子使得在组件挂载后执行一次性操作变得简单直观。…

一个简单的Qt Console Application计算练习程序

初步体验Qt Creator 用途&#xff1a;练习20以内2位数乘法速算的程序 功能1&#xff1a;支持用户设定题目数量 std::cout << "请输入本次练习题目数量&#xff1a;";int numProblems 0;std::string num;std::cin >> num;try {numProblems std::stoi(…

飞腾X100适配Ubuntu说明

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

Docker配置网站环境

Mysql 先安装mysql 启动并后台运行&#xff1a;run -d 容器名称&#xff1a;--name 设置端口映射&#xff1a;-p 主机端口&#xff1a;容器端口 环境变量&#xff1a;-e 最后指定镜像名称 sudo docker run -d \--name mysql\-p 3306:3306\-e MYSQL_ROOT_PASSWORD123456\…

单细胞空间转录组RCTD去卷积分析学习和整理

RCTD(Robust Cell Type Decomposition)&#xff0c;是一种用于将单细胞RNA测序数据中的细胞类型注释转移到空间转录组学数据上的方法。RCTD 通过整合单细胞和空间转录组学数据&#xff0c;能够较为精确地为空间点&#xff08;spots&#xff09;分配细胞类型或细胞类型的混合&am…