【C++力扣】917.仅仅反转字母|387.字符串中第一个唯一字符|415.字符串相加


✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛)
🌈 个人Motto:他强任他强,清风拂山冈!
🔥 所属专栏:C++深入学习笔记
💫 欢迎来到我的学习笔记!

一、917.仅仅反转字母
1.1 题目描述
给你一个字符串s,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的s。
示例 1:
输入:s = "ab-cd"
输出:"dc-ba"
示例 2:
输入:s = "a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"
示例 3:
输入:s = "Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"
● 1 <= s.length <= 100
● s 仅由 ASCII 值在范围 [33, 122] 的字符组成
● s 不含 '\"' 或 '\\'
只反转字母,不反转特殊符号,相当于忽略掉特殊字符,首尾交换。
1.2 分析过程
想法一:使用迭代器:
- 一个正向迭代器指向开始位置;
- 一个反向迭代器指向结束位置;
- 缺点:正向迭代器与反向迭代器不能做比较,因为类型不相同。类型如下:
cout << "string::iterator" << typeid(string::iterator).name() << endl;
cout << "string::reverse_iterator" << typeid(string::reverse_iterator).name() << endl;//string::iteratorclass std::_String_iterator<class std::_String_val<struct std::_Simple_types<char> > >
//string::reverse_iteratorclass std::reverse_iterator<class std::_String_iterator<class std::_String_val<struct std::_Simple_types<char> > > >
想法二:使用两个正向迭代器即使用下标;不能使用范围for,因为底层就是迭代器。
- 避免一个字母都没有的情况:加上一个
left < right条件; - 避免死循环不懂的情况:
swap(s[left++], s[right--]);交换以后继续往两边走。
1.3 代码解答
class Solution
{
public:// 判断字符是不是字母bool isLetter(char ch){if (ch >= 'a' && ch <= 'z')return true;else if (ch >= 'A' && ch <= 'Z')return true;elsereturn false;}// 使用下标进行遍历:string reverseOnlyLetters(string s){int left = 0;int right = s.size() - 1;// size表示最后一个字符串的下一个位置while (left < right){while (left < right && !isLetter(s[left]))// left < right条件可以{++left;// 往右边走}while (left < right && !isLetter(s[right])){--right;// 往左边走}swap(s[left++], s[right--]);// 交换,为什么++、--?避免死循环,不往后走,因此交换完后,left继续往右、right继续往左!否则他们两个就不动了}return s;}
};
二、387.字符串中第一个唯一字符
7月20日3:02:00
2.1 题目描述
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例 1:
输入: s = "leetcode"
输出: 0
示例 2:
输入: s = "loveleetcode"
输出: 2
示例 3:
输入: s = "aabb"
输出: -1
提示:
● 1 <= s.length <= 105
● s 只包含小写字母
2.2 分析过程以及代码实现
- 方法一
- 时间复杂度:
O(N<sup>2</sup>);(不优) - 每个字符都与其他字符对比一遍。
- 方法二:计数排序
- 时间复杂度:
O(N); - 统计每个字符出现的次数,返回只第一个只出现一次的字符的索引(即下标)。
- 实现:
class Solution
{
public:int firstUniqChar(string s){// 使用相对映射的方法:进行计数排序int count[26] = { 0 };// 统计次数for (auto ch : s)// 使用范围for进行遍历{count[ch - 'a']++;// ????// 这里是要统计字符串s中的字符到26个小写字母里面去,有多少个字符,26个字母中就会出现对应的次数}// 这里就是用下标访问,而不是范围forfor (size_t i = 0; i < s.size(); ++i){if (count[s[i] - 'a'] == 1)// 说明它只出现了一次,而且是第一个只出现一次的字符return i;}return -1;// 说明s字符串中的都是重复出现的}
};
三、415.字符串相加
7月20日3:10:00
3.1 题目描述
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"
提示:
● 1 <= num1.length, num2.length <= 104
● num1 和num2 都只包含数字 0-9
● num1 和num2 都不包含任何前导零
3.2 分析过程
想法一:error
- 当整型数据很大时,即使是
long long类型也可能存储不下,就会使用字符串进行存储、运算。然后使用字符串模拟四则运算,这就是所谓的“大数运算”。本题模拟的是加法运算。 - 字符串转换成整型:
stoi;各种类型转换成字符串:to_string - 但是这种方法不行,转换后数据不仅超出表示范围,而且还会丢失!
想法二:right
- 字符串中的字符倒着取,从末尾开始进行运算;
- 只要内存足够,字符串存储在内存中是一定能存储下的;(例如:整数长度100万,也就是内存空间大约1MB)
- 字符串要两个都结束了才是结束,短字符串结束时长字符串是需要继续的,例如:
"9999999999999999" + "1",它不断地都有进位的,不能直接将前几位字符数据拷贝下来。
class Solution {
public:string addStrings(string num1, string num2) {string str;// 得到的最终结果存储在这里int end1 = num1.size() - 1, end2 = num2.size() - 1;// 进位int next = 0;while (end1 >= 0 || end2 >= 0)// 两个都要结束{int val1 = end1 >= 0 ? num1[end1] - '0' : 0;int val2 = end2 >= 0 ? num2[end2] - '0' : 0;end1--;end2--;int ret = val1 + val2 + next;// 加上进位next = ret / 10;// 记下进位数:ret大于10,记下1;ret小于10,记下0ret = ret % 10; // 将最终的结果进行头插到str中:(不太好)// 不断头插n次时,时间复杂度就已经O(N)了str.insert(str.begin(), '0' + ret);}if (next == 1)str.insert(str.begin(), '1');return str;}
};
3.3 代码实现
写法一:使用头插
class Solution {
public:string addStrings(string num1, string num2) {string str;// 得到的最终结果存储在这里int end1 = num1.size() - 1, end2 = num2.size() - 1;// 进位int next = 0;while (end1 >= 0 || end2 >= 0)// 两个都要结束{int val1 = end1 >= 0 ? num1[end1] - '0' : 0;int val2 = end2 >= 0 ? num2[end2] - '0' : 0;end1--;end2--;int ret = val1 + val2 + next;// 加上进位next = ret / 10;// 记下进位数:ret大于10,记下1;ret小于10,记下0ret = ret % 10; // 将最终的结果进行头插到str中:(不太好)// 不断头插n次时,时间复杂度就已经O(N)了str.insert(str.begin(), '0' + ret);}if (next == 1)str.insert(str.begin(), '1');return str;}
};
写法二:使用尾插
class Solution {
public:string addStrings(string num1, string num2){string str;// 得到的最终结果存储在这里int end1 = num1.size() - 1, end2 = num2.size() - 1;// 进位int next = 0;while (end1 >= 0 || end2 >= 0)// 两个都要结束{int val1 = end1 >= 0 ? num1[end1] - '0' : 0;int val2 = end2 >= 0 ? num2[end2] - '0' : 0;int ret = val1 + val2 + next;// 加上进位next = ret / 10;// 记下进位数:ret大于10,记下1;ret小于10,记下0ret = ret % 10;str += ('0' + ret);// 尾插,这里是operator+=的一种用法,O(N)}if (next == 1)str += '1';// 结果是倒着的,就需要进行逆置:即使用算法库里面的reverse,但是要求是双向迭代器reverse(str.begin(), str.end());return str;}
};

相关文章:
【C++力扣】917.仅仅反转字母|387.字符串中第一个唯一字符|415.字符串相加
✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 🔥 所属专栏:C深入学习笔记 💫 欢迎来到我的学习笔记! 一、917.仅仅反转字母 1.1 题目描述…...
RxSwift系列(四)异常处理和调试操作
一、异常处理 1.catchErrorJustReturn 当遇到 error 事件的时候,就返回指定的值,然后结束。 enum MyError: Error {case Acase B }let disposeBag DisposeBag()let sequenceThatFails PublishSubject<String>()sequenceThatFails.catchErrorJ…...
Excel基础:电子表格Excel的使用技巧合集
一、内容 1.表格下拉框选择内容...
教育技术革新:SpringBoot在线教育系统开发
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理微服务在线教育系统的相关信息成为必然。开…...
【大数据入门 | Hive】Join语句
1. 等值join Hive支持通常的sql join语句,但是只支持等值连接,不支持非等值连接。但sql是支持非等值连接的。 1)案例实操 (1)根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称。 …...
爬虫案例——爬取情话网数据
需求: 1.爬取情话网站中表白里面的所有句子(表白词_表白的话_表白句子情话大全_情话网) 2.利用XPath来进行解析 3.使用面向对象形发请求——创建一个类 4.将爬取下来的数据保存在数据库中 写出对应解析语法 //div[class"box labelbo…...
端模一体,猎豹移动对大模型机器人发展路径清晰
今年世界机器人大会刚刚收官不久,接咖啡、拿苹果、摊煎饼……人形机器人在这届大会上备受关注,厂商们编排“整活”,展位几乎水泄不通。 自从AI大模型开始全面改变市场开始,关于机器人的方向性争论就不绝于耳,就在最近的…...
操作系统笔记
1、操作系统是什么 操作系统是管理硬件和软件的一种应用程序。操作系统是运行在计算机上最重要的一种软件,它管理计算机的资源和进程以及所有软硬件。为计算机提供一种中间层,使得应用软件和硬件进行分离,让我们无需关注硬件的实现ÿ…...
两个wordpress网站共用一个数据库的数据表
在WordPress中,如果你想要两个不同的网站调用同一个数据表,你可以通过以下几种方法实现: 方法一:使用共享数据库 1. 设置共享数据库: – 确保两个WordPress网站都可以访问同一个数据库。 – 在数据库服务器上创建一…...
工具方法 - 面试中回答问题的技巧
在面试中,回答问题的技巧尤为重要。它不仅展示了你的知识和能力,还体现了你处理压力和沟通的技巧。以下是一些在面试中常用的回答技巧,以及如何在这些场合有效地回应问题的示例: 1. 抓住问题的核心 面试官通常会提出直接的问题&a…...
频繁full gc问题排查及解决
为什么我们要对频繁full gc的情况进行处理---》频繁full gc会导致stw,影响用户体验。 (1)先进行问题的排查 如果频繁full gc 会报警,公司有自己的监控平台,可以查看full gc的情况 如果公司没有自己的监控平台&#…...
昇思学习打卡营第33天|基于MindSpore的恶性皮肤肿瘤识别
1. 实验介绍 本次实验的目标是基于MindSpore框架,训练一个ResNet50模型,用于恶性皮肤肿瘤的分类识别。本实验将使用包含四类皮肤肿瘤图片的数据集,针对ResNet50模型进行微调,训练出一个能够精准分类皮肤病的模型。主要过程包括数据…...
基于SpringBoot+Vue的网约车管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
Java、PHP、ASP、JSP、Kotlin、.NET、Go
Java 1995年,Java诞生了,微软的Java是J#,早期是J. 它在C的基础上增强了安全性,不允许多重继承,堆栈不允许类对象,数组和枚举都是类对象。 Java的诞生 早期的Sun公司想要在消费级嵌入式设备编写可移植的代码…...
华为-单臂路由
1、什么是单臂路由 单臂路由(Single-Arm Routing)是一种网络架构和配置技术,它允许路由器通过一个物理接口来管理多个虚拟局域网(VLAN)之间的通信。 这个物理接口被配置为Trunk模式,以便能够传输来自不同VL…...
AI应用的东风,奥特曼不想错过
文|魏琳华 编|王一粟 作为炙手可热的AI公司,Open AI又一次拿到了一轮足以令对手眼红的巨额融资。10月2日,Open AI宣布顺利完成66亿美元融资,补上了烧钱研发亏损的同时,还为下一轮竞争拿到了资金支持。 跻…...
LeetCode[中等] 238. 除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂…...
Linux plt表调用汇编代码分析
linux调用共享库中的函数时通过plt表和got表实现位置无关代码,过程中涉及到lazy binding,即在第一调用外部函数时解析被调用的函数地址并将地址写入到got表,后续调用则不需要解析函数地址,具体过程如下 1.c程序如下 #include &l…...
ubunut声卡配置 播放视频没有声音的解决方法 蓝牙问题
文章目录 🌕ubuntu22.04网页没有声音,声卡提示Dummy Output🌙方法一:切换内核🌙方法二:UBUNTU 声卡提示Dummy Output或伪输出解决办法(2020.04.02🌙方法三:解决Ubuntu18.…...
《软件工程概论》作业一:新冠疫情下软件产品设计
课程说明:《软件工程概论》为浙江科技学院2018级软件工程专业在大二下学期开设的必修课。课程使用《软件工程导论(第6版)》(张海藩等编著,清华大学出版社)作为教材。以《软件设计文档国家标准GBT8567-2006》…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
