[代码随想录09]字符串2的总结
前言
处理字符串主要是有思路,同时总结方法。
题目链接
151. 反转字符串中的单词 - 力扣(LeetCode)
55. 右旋字符串(第八期模拟笔试)
一、翻转字符串里的单词
这个题目的主要思路,代码采用从后往前遍历字符串的方式,逐个提取单词并按反转顺序添加到新的字符串中,同时妥善处理了空格相关的问题,最终得到符合要求的输出字符串。
具体步骤:
初始化与循环准备:首先获取输入字符串
s
的长度,并将用于遍历字符串的索引i
初始化为字符串最后一个字符的位置(i = s.size() - 1
)。同时创建一个空字符串ans
,用来存储最终处理好的结果。外层循环(处理每个单词):通过
while(i >= 0)
这个外层循环来依次处理字符串中的每个单词。从字符串末尾开始向前遍历,这个循环会持续执行,直到整个字符串都被处理完(也就是i
小于 0 时结束)。跳过末尾空格:在每次开始处理一个新的可能的单词前,有一个内层的
while
循环while(i >= 0 && s[i] == ' ') --i;
,它的作用是跳过字符串末尾连续出现的空格。比如字符串最后可能跟着多个空格,要先把这些空格跳过,找到真正最后一个单词的最后一个字符位置。确定单词长度:紧接着另一个内层
while
循环while(i >= 0 && s[i]!= ' ') --i, ++c;
,这个循环从刚才跳过空格后的位置开始,继续向前遍历,只要当前字符不是空格(意味着还处于同一个单词内),就继续向前移动索引i
,同时用计数器c
记录当前单词的字符个数。例如对于单词"blue"
,这个循环会统计出它包含 4 个字符。提取并添加单词到结果字符串:如果计数器
c
不为 0,说明找到了一个有效的单词,那么通过s.substr(i + 1, c)
提取出这个单词(substr
函数用于截取从指定位置开始、指定长度的子字符串,这里i + 1
是因为刚才循环结束时i
指向单词的前一个位置,所以要加 1 才是单词开始的正确位置,c
就是单词的长度),并把这个单词添加到结果字符串ans
中,同时在单词后面添加一个空格(ans += s.substr(i + 1, c) + " ";
),方便后续区分不同单词。去除最后多余的空格:当整个字符串都处理完后,通过
return ans.substr(0, ans.size() - 1);
返回最终结果。由于在添加每个单词时都额外添加了一个空格,最后结果字符串末尾会多一个空格,所以这里通过截取字符串去掉最后这个多余的空格,只返回前面正确处理好的内容,也就是完成了单词反转并且格式整理好的字符串。
string reverseWords(string s) {int i=s.size()-1;string ans;while(i>=0){int c=0;while(i>=0&&s[i]==' ')--i;while(i>=0&&s[i]!=' ')--i,++c;if(c)ans+=s.substr(i+1,c)+" ";}return ans.substr(0,ans.size()-1);}
二、右旋转字符串
思路:先逆序翻转,然后再翻转前N个字符串,再翻转后面的。
//逆序翻转
#include<iostream>
#include<algorithm>
using namespace std;
int main() {int n;string s;cin >> n;cin >> s;int len = s.size(); //获取长度reverse(s.begin(), s.end()); // 整体反转reverse(s.begin(), s.begin() + n); // 先反转前一段,长度nreverse(s.begin() + n, s.end()); // 再反转后一段cout << s << endl;
}
总结
对于字符串的处理,
遍历方式
正向遍历:按顺序从开头到结尾访问字符,适用于常规顺序处理。
反向遍历:从末尾往开头遍历,便于处理与结尾相关或需逆序操作的情况。
双指针遍历:两指针依规则同步或异步移动,用于对比、处理对应字符,如判断回文。
字符操作
比较:判断字符是否为特定类型,依结果执行不同逻辑。
转换:进行大小写、字符与数值等转换,便于后续处理。
替换与删除:按需对字符替换或删除。
子字符串处理
提取:截取子字符串用于进一步分析。
查找:判断是否包含特定子字符串。
辅助数据结构
栈:用于顺序反转、暂存符合后进先出特点的内容。
队列:按先进先出顺序处理相关元素。
哈希表:高效统计字符、子字符串出现情况等。
动态规划用于存在最优子结构性质的复杂问题,通过定义状态与状态转移方程求解最优解。
相关文章:

[代码随想录09]字符串2的总结
前言 处理字符串主要是有思路,同时总结方法。 题目链接 151. 反转字符串中的单词 - 力扣(LeetCode) 55. 右旋字符串(第八期模拟笔试) 一、翻转字符串里的单词 这个题目的主要思路,代码采用从后往前遍历字…...

java注解(一):什么是注解?什么是元注解?如何自定义注解?注解的原理是什么?
目录 1、什么是注解? 2、什么是元注解 1、Target() 2、Retention() 3、Documented 4、Inherited 3、如何自定义注解以解使用 4、注解的原理 本篇文章主要是介绍注解的概念、原理,以及通过代码演示4种元注解、如何自定义注解。通过反编译的形式进…...

AD20 原理图库更新到原理图
一 点击工具,从库更新。快捷键TL 二 点击完成 三 执行变更,最后点击关闭...

.NET用C#导入Excel数据到数据库
将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性,还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中,Excel作为数据输入和初步整理的工具非常普遍,但其功能对于复杂查询、大规模数据管理和跨部门的数据共享…...

小身躯大能量-供热系统通过EtherCAT转Profinet网关进行升级
在现代工业自动化领域,通信技术的进步对于提高系统效率、稳定性和可靠性起着至关重要的作用。EtherCAT(Ethernet for Control Automation Technology)作为一种实时以太网解决方案,因其高性能及成本效益高等特点,在众多…...
Android11.0系统关闭App所有通知
通过广播接收方式,根据包名关闭App所有通知。 packages/apps/Settings$ git diff diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d4c54c6ed8..1ce7d4136f 100644 --- a/AndroidManifest.xmlb/AndroidManifest.xml-106,6 106,7 <uses-permissio…...

# issue 8 TCP内部原理和UDP编程
TCP 通信三大步骤: 1 三次握手建立连接; 2 开始通信,进行数据交换; 3 四次挥手断开连接; 一、TCP内部原理--三次握手 【第一次握手】套接字A∶"你好,套接字B。我这儿有数据要传给你,建立连接吧。" 【第二次…...
力扣100题--移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...

Spring 邮件发送
Spring 邮件发送 1. 主要内容(了解) 2. JavaMail 概述(了解) JavaMail,顾名思义,提供给开发者处理电⼦邮件相关的编程接⼝。JavaMail 是由 Sun 定义的⼀套收发电⼦邮件的 API,它可以⽅便地执⾏⼀…...

利用 360 安全卫士极速版关闭电脑开机自启动软件教程
在使用电脑的过程中,过多的开机自启动软件会严重拖慢电脑的开机速度,影响我们的使用体验。本教程中简鹿办公将详细介绍如何使用 360 安全卫士极速版关闭电脑开机自启动软件,让您的电脑开机更加迅速流畅。 一、打开 360 安全卫士极速版 在电…...
楼房销售系统
文末获取源码和万字论文,制作不易,感谢点赞支持。 毕 业 设 计(论 文) 题目:楼房销售系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储…...

UML箭线图的理解和实践
在软件开发的世界里,UML(统一建模语言)作为一种标准化的建模语言,扮演着举足轻重的角色。UML类图更是软件开发设计和架构过程中的核心工具,它不仅能帮助开发者明确系统中的类及其关系,还能为后续的代码实现…...

Qt入门8——Qt文件
1. Qt文件概述 文件操作是应用程序必不可少的部分。Qt作为⼀个通用开发库,提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。 2. 输入输出设备类 在…...

鸿翼受邀出席2024海峡两岸档案暨缩微学术交流会
近日,由中国档案学会、中国文献影像技术协会共同主办,中华档案暨资讯微缩管理学会参加的2024年海峡两岸档案暨缩微学术交流会在乌鲁木齐召开。鸿翼联合创始人兼CTO罗永秀受邀出席本次交流会并作主题分享。 自1992年以来,该学术交流会已连续举…...

支持win7系统的onnxruntime
在win7 X86系统上,使用了onnxruntime.dll库做AI识别,但是在win7上运行报0xc0000005的错误 经查,ONNX Runtime从v1.15.0版本开始不再支持Windows 7及其之前的操作系统,即便尝试重新编译源代码亦无法在这些老系统上运行,…...

如何利用内链策略提升网站的整体权重?
内链是谷歌SEO中常常被低估的部分,实际上,合理的内链策略不仅能帮助提升页面间的关联性,还可以增强网站的整体权重。通过正确的内链布局,用户可以更流畅地浏览你的网站,谷歌爬虫也能更快地抓取到更多页面,有…...

鸿蒙分享(二):引入zrouter路由跳转+封装
码仓库:https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 鸿蒙第三方库地址:OpenHarmony三方库中心仓 zrouter地址:OpenHarmony三方库中心仓 1.引入zrouter 1.打开终端界面:输入 ohpm install hzw/zrouter 2.在项目…...

【计算机网络】实验11:边界网关协议BGP
实验11 边界网关协议BGP 一、实验目的 本次实验旨在验证边界网关协议(BGP)的实际作用,并深入学习在路由器上配置和使用BGP协议的方法。通过实验,我将探索BGP在不同自治系统之间的路由选择和信息交换的功能,理解其在互…...

leetcode 1853 转换日期格式(postgresql)
需求 表: Days ----------------- | Column Name | Type | ----------------- | day | date | ----------------- day 是这个表的主键。 给定一个Days表,请你编写SQL查询语句,将Days表中的每一个日期转化为"day_name, month_name day, year"…...

掌握时间,从`datetime`开始
文章目录 掌握时间,从datetime开始第一部分:背景介绍第二部分:datetime库是什么?第三部分:如何安装这个库?第四部分:简单库函数使用方法1. 获取当前日期和时间2. 创建特定的日期3. 计算两个日期…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...