【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》…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
从零开始打造 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修改…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
