【C++修行之道】string类练习题

目录

387. 字符串中的第一个唯一字符

125. 验证回文串 

917. 仅仅反转字母

415. 字符串相加(重点)

541. 反转字符串 II


387. 字符串中的第一个唯一字符

字符串中的第一个唯一字符 - 力扣(LeetCode)

给定一个字符串 s ,找到它的第一个不重复的字符,并返回它的索引 。

如果不存在,则返回 -1 。

示例 1:

输入: s = "leetcode"
输出: 0

示例 2:

输入: s = "loveleetcode"
输出: 2

示例 3:

输入: s = "aabb"
输出: -1

提示:

  • 1 <= s.length <= 105
  • s 只包含小写字母

class Solution {
public:int firstUniqChar(string s) {int count[26] = {0};// 统计次数for(auto ch:s){count[ch-'a']++;}for(size_t i =0; i< s.size(); ++i){if(count[s[i] - 'a'] == 1){return i;}}return -1;}
};

 

  • ch - 'a' 计算字符 ch 相对于字符 'a' 的位置索引。例如,字符 'a' 的位置为 0,字符 'b' 的位置为 1,依此类推。
  • count[ch - 'a']++ 表示将 count 数组中相应位置的值加 1,从而记录字符 ch 出现的次数。
  • count[s[i] - 'a'] == 1 检查字符 s[i] 是否在字符串 s 中只出现了一次。如果是,则返回该字符的索引 i

125. 验证回文串 

验证回文串  - 力扣(LeetCode)

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 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 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

提示:

  • 1 <= s.length <= 2 * 105
  • s 仅由可打印的 ASCII 字符组成
class Solution {
public:// 判断字符是数字还是字母bool isLetterOrNumber(char ch){return (ch >= '0' && ch <= '9')|| (ch >= 'a' && ch <= 'z')|| (ch >= 'A' && ch <= 'Z');}//判断字符串是否是回文串bool isPalindrome(string s) {// 先小写字母转换成大写,再进行判断for (auto& ch : s){if (ch >= 'a' && ch <= 'z')ch -= 32;}int begin = 0, end = s.size() - 1;while (begin < end){while (begin < end && !isLetterOrNumber(s[begin]))++begin;while (begin < end && !isLetterOrNumber(s[end]))--end;if (s[begin] != s[end]){return false;}else{++begin;--end;}}return true;}
};

 

  • while (begin < end) 循环确保指针交替向中间移动,直到它们相遇或交错。
  • while (begin < end && !isLetterOrNumber(s[begin])) ++begin; 跳过非字母数字字符,移动 begin 指针向右。
  • while (begin < end && !isLetterOrNumber(s[end])) --end; 跳过非字母数字字符,移动 end 指针向左。
  • 如果 s[begin] != s[end],即对应字符不相等,返回 false,表示字符串不是回文串。
  • 如果对应字符相等,继续移动指针 begin 向右,end 向左。

917. 仅仅反转字母

仅仅反转字母 - 力扣(LeetCode)

给你一个字符串 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 不含 '\"' 或 '\\'

class Solution {
public:// 判断字符是否是字母bool isLetter(char ch){if (ch >= 'a' && ch <= 'z')return true;if (ch >= 'A' && ch <= 'Z')return true;return false;}// 反转字符串中的字母string reverseOnlyLetters(string S) {if (S.empty())return S;size_t begin = 0, end = S.size() - 1;while (begin < end){while (begin < end && !isLetter(S[begin]))++begin;while (begin < end && !isLetter(S[end]))--end;swap(S[begin], S[end]);++begin;--end;}return S;}
};
  • reverseOnlyLetters 函数接收一个字符串 S,并返回一个仅反转字母部分的字符串。
  • 首先检查字符串是否为空,如果是,则直接返回原字符串。
  • 使用 while (begin < end) 循环确保指针交替向中间移动,直到它们相遇或交错。
  • while (begin < end && !isLetter(S[begin])) ++begin; 跳过非字母字符,移动 begin 指针向右。
  • while (begin < end && !isLetter(S[end])) --end; 跳过非字母字符,移动 end 指针向左。
  • swap(S[begin], S[end]); 交换 beginend 指针指向的字母。
  • 继续移动指针 begin 向右,end 向左。
  • beginend 指针相遇或交错时,返回反转后的字符串 S

415. 字符串相加(重点)

字符串相加 - 力扣(LeetCode)

给定两个字符串形式的非负整数 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 都不包含任何前导零
class Solution {
public:string addStrings(string num1, string num2) {int end1 = num1.size() - 1;int end2 = num2.size() - 1;string str;int next = 0;// 进位while(end1 >= 0 || end2 >= 0){int x1 = end1 >= 0 ? num1[end1--] - '0' : 0;int x2 = end2 >= 0 ? num2[end2--] - '0' : 0;int x = x1 + x2 + next;// 处理进位next = x / 10;x = x % 10;// 头插// str.insert(0, 1, '0'+x);str.insert(str.begin(), '0'+x);}// 还有一个进位没处理if(next == 1){str.insert(str.begin(), '1');}  return str;}
};

 

  • while (end1 >= 0 || end2 >= 0) 循环确保我们遍历两个字符串,直到两个字符串都处理完毕。
  • x1x2 分别是当前字符对应的数字,如果对应的字符已经处理完毕,则赋值为 0
  • x 是当前位相加的结果,包括进位 next
  • next = x / 10 计算新的进位值。
  • x = x % 10 计算当前位的实际数字。
  • str.insert(str.begin(), '0' + x) 将当前位的结果插入到结果字符串的头部。
  • end1--end2-- 将指针分别向前移动一位。
  • 如果循环结束后还有进位,则在结果字符串的头部插入 '1'
class Solution {
public:string addStrings(string num1, string num2) {int end1 = num1.size() - 1;int end2 = num2.size() - 1;string str;int next = 0;// 进位while(end1 >= 0 || end2 >= 0){int x1 = end1 >= 0 ? num1[end1--] - '0' : 0;int x2 = end2 >= 0 ? num2[end2--] - '0' : 0;int x = x1 + x2 + next;// 处理进位next = x / 10;x = x % 10;// 尾插str += ('0' + x);}// 还有一个进位没处理if(next == 1){str += '1';}  reverse(str.begin(), str.end());return str;}

541. 反转字符串 II

541. 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

提示:

1 <= s.length <= 10000
s 仅由小写英文组成
1 <= k <= 10000

class Solution {
public:string reverseStr(string s, int k) {int n = s.length();for(int i = 0; i < n; i += 2 * k)reverse(s.begin() + i, s.begin() + min(i + k, n));return s;}
};

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

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

相关文章

中霖教育怎么样?税务专业可以考哪些证书?

在税务专业领域&#xff0c;专业技能的认证对职业发展至关重要。以下为税务专业相关可以考的证书&#xff1a; 1. 注册税务师资格证书&#xff1a;该证书是税务专业人士的关键资质&#xff0c;使持证者可以从事税务相关工作。 2. 会计职称证书&#xff1a;会计系列证书分为初…

笔记本系统

笔记本更新升级 笔记本购入太早&#xff0c;所用内存只有4G&#xff0c;通过更好内存条升级系统性能 查看电脑支持内存大小 cmd命令输入wmic memphysical get maxcapacity 这串数字就是电脑最大支持内存数值&#xff0c;做除法除两次1024&#xff01;&#xff0c;得出来的…

查看oracle ojdbc所支持的JDBC驱动版本

oracle jcbc驱动的下载地址参考&#xff1a;JDBC and UCP Downloads page 其实上文中对ojdbc所支持的JDBC驱动版本已经有说明了&#xff0c;不过&#xff0c;因为oracle的驱动包很多时间&#xff0c;都是在公司内部私服里上传维护的&#xff0c;上传的时候&#xff0c;可能又没…

flutter 实现AppStore左右滑动

在AppStore中如何实现左右滑动&#xff0c;因为使用PageView会居中显示&#xff0c;不会居左显示&#xff0c;目前没有找到解决方案&#xff0c;我使用的方案是ListView自定义physics实现的。 代码 SizedBox(width: 200,height: 400,child: ListView.builder(scrollDirection:…

Java中实现二维数组(矩阵)的转置

在矩阵运算中&#xff0c;矩阵的转置是一个基本操作&#xff0c;即将矩阵的行变成列&#xff0c;列变成行。在Java中&#xff0c;我们可以通过编写一个方法来实现二维数组的转置。下面&#xff0c;我将详细介绍如何在Java中完成这一任务&#xff0c;并提供完整的代码示例。 编…

鸿蒙语言基础类库:【@ohos.util.TreeSet (非线性容器TreeSet)】

非线性容器TreeSet 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 T…

HDFS 块重构和RedundancyMonitor详解

文章目录 1. 前言2 故障块的重构(Reconstruct)2.1 故障块的状态定义和各个状态的统计信息2.2 故障文件块的查找收集2.5.2.1 misReplica的检测2.5.2.2 延迟队列(postponedMisreplicatedBlocks)的构造和实现postponedMisreplicatedBlocks中Block的添加postponedMisreplicatedBloc…

绿盟培训入侵排查

一、webshell 排查 1、文件特征 2、windows 3、linux 4、内存马 二、web 日志排查 1、日志排查 2、中间件报错排查 三、服务器失陷处置

Windows环境人大金仓数据库命令常规操作

Windows环境人大金仓数据库命令常规操作 下文将介绍人大金仓数据库常见命令操作&#xff0c;包括具体使用命令如创建数据库、创建用户、授权等相关操作。 1、打开命令提示符窗口 找到数据库安装目录进入server/bin目录&#xff0c;输入cmd,打开命令提示符窗口&#xff0c;如…

Java getSuperclass和getGenericSuperclass

1.官方API对这两个方法的介绍 getSuperclass : 返回表示此 Class 所表示的实体&#xff08;类、接口、基本类型或 void&#xff09;的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void&#xff0c;则返回 null。如果此对象表示一个数组类&#xff…

探秘微信广告设计组:一位产品体验设计师的日常与成长

目录 我的工位&#xff1a;灵感与回忆的汇聚地 我们的设计&#xff1a;用心定格每一个瞬间 设计的多样性&#xff1a;从社交广告到过年IP形象 咖啡与工作的日常&#xff1a;从抵触到入坑 广告设计&#xff1a;我选择&#xff0c;我热爱 实习生的培养&#xff1a;实践与思…

Qt(四)事件

文章目录 一、概念二、&#xff08;一&#xff09;&#xff08;二&#xff09;QImage类&#xff08;三&#xff09;鼠标事件和键盘事件1. 鼠标事件2. 键盘事件 &#xff08;四&#xff09;定时器事件1. 采用定时器事件2. QTimer定时器类 三、 一、概念 事件是由窗口系统或者自…

小程序内容管理系统设计

设计一个小程序内容管理系统&#xff08;CMS&#xff09;时&#xff0c;需要考虑以下几个关键方面来确保其功能完善、用户友好且高效&#xff1a; 1. 需求分析 目标用户&#xff1a;明确你的目标用户群体&#xff0c;比如企业、媒体、个人博主等&#xff0c;这将决定系统的功…

zynq启动和程序固化流程

普通FPGA启动 FPGA的启动方式主要包含主动模式、被动模式和JTAG模式。 主动模式&#xff08;AS模式&#xff09; 当FPGA器件上电时&#xff0c;它作为控制器从配置器件EPCS中主动发出读取数据信号&#xff0c;并将EPCS的数据读入到自身中&#xff0c;实现对FPGA的编程。这种…

Mac的系统数据怎么删除 cleanmymac会乱删东西吗 cleanmymac有用吗

作为一款专业级的苹果电脑清理软件&#xff0c;CleanMyMac可以精准识别系统垃圾&#xff0c;有效防止Mac系统数据被误删。软件可以深入系统底层&#xff0c;清理无用的系统数据&#xff0c;优化苹果电脑设置&#xff0c;提升Mac系统性能。有关Mac的系统数据可以删吗&#xff0c…

计算机视觉之ResNet50图像分类

前言 图像分类是计算机视觉应用中最基础的一种&#xff0c;属于有监督学习类别。它的任务是给定一张图像&#xff0c;判断图像所属的类别&#xff0c;比如猫、狗、飞机、汽车等等。本章将介绍使用ResNet50网络对CIFAR-10数据集进行分类。 ResNet网络介绍 ResNet50网络是由微…

Nature Protocols:整合多组学并进行因果推理的系统框架

转载自&#xff1a;MetaAI 在生物学研究中&#xff0c;随着实验和计算技术的进步&#xff0c;生物系统研究产生了大量高通量数据。技术努力主要集中在提高吞吐量、降低成本和提升实验与计算效率。因此&#xff0c;整合不同类型组学数据&#xff0c;并通过关联分析识别关键因素…

基于主成分分析PCA的一维时间序列信号降噪方法(Python)

主成分分析PCA是面向模式分类的特征提取最典型的工具&#xff0c;是满足上述映射准则的一种数据压缩的方法。作为经典的特征提取方法&#xff0c;是在不减少原始数据所包含的内在信息前提下&#xff0c;将原始数据集转化为由维数较少的“有效”特征成分来表示&#xff0c;使其在…

GD32F303之CAN通信

1、CAN时钟 GD32F303主时钟频率最大是120Mhz,然后APB1时钟最大是60Mhz,APB2时钟最大是120Mhz,CAN挂载在APB1总线上面 所以一般CAN的时钟频率是60Mhz,这个频率和后面配置波特率有关 2、GD32F303时钟配置 首先我们知道芯片有几个时钟 HXTAL&#xff1a;高速外部时钟&#xff1…

用理解与包容对待阿斯伯格综合征患者

在我们的社会中&#xff0c;存在着这样一个特殊的群体——阿斯伯格综合征患者。他们在社交互动、沟通交流和行为模式上有着独特的表现&#xff0c;需要我们以正确的方式去理解和对待。 我们要认识到阿斯伯格综合征是一种神经发育障碍&#xff0c;而非个人的选择或过错。患者可能…