当前位置: 首页 > news >正文

代码随想录算法训练营第六天 -- 字符串1 || 344.反转字符串I / 541.反转字符串II / kamacoder54.替换数字--第八期模拟笔试

代码随想录算法训练营第六天 -- 字符串1 || 344.反转字符串I / 541.反转字符串II / kamacoder54.替换数字--第八期模拟笔试

  • 344.反转字符串I
    • 思路
  • 541.反转字符串II
    • 题目理解
    • 解题思路
      • 边界细节
      • reverse()函数的实现
  • [kamacoder54.替换数字 -- 第八期模拟笔试](https://kamacoder.com/problempage.php?pid=1064)
    • 解题思路

344.反转字符串I

文档讲解:代码随想录算法训练营
视频讲解:算法视频公开课
状态:做出来了,用了一个临时字符,反复交换就行了

思路

本道题是实现reverse()函数,所以不要直接使用reverse()函数。
本道题是要使用双指针,使用相向双指针的方法。

class Solution {
public:void reverseString(vector<char>& s) {int n = s.size();for (int i = 0, j = n - 1; i < n / 2; i++, j--) {swap(s[i], s[j]);}}
};

这里swap()交换函数的实现如下:

        	// swap()函数实现方法一tmp = s[i];s[i] = s[j];s[j] = tmp;
        	// swap()函数实现方法二s[i] ^= s[j];s[j] ^= s[i];s[i] ^= s[j];

541.反转字符串II

文档讲解:代码随想录算法训练营
视频讲解:算法视频公开课
状态:没做出来,没读懂题,绕蒙了。

题目理解

这道题读题有点难理解。
这道题是在讲,一个字符串s,每2k个为一组。
每组中前k个元素反转,后k个不变。
如果剩下的字符数目不足2k个,那么还有两种情况:
(1)如果不足k个,那么这些元素反转
(2)如果k < 剩下字符数目 < 2k,那么前k个反转,剩下的不变。

解题思路

这道题我们for循环里,i += 2k进行循环,每次循环中,只反转[i, i + k)区间的字符,反转完结束本次循环。如果剩余字符不足k个,那么反转[i, n)区间的字符。
代码:

class Solution {
public:string reverseStr(string s, int k) {int n = s.size();// 进入循环,每 2k 个字符为一组for (int i = 0; i < n; i += 2 * k) {// 如果这组字符数 > k 个,那么前 k 个字符反抓if (i + k <= n) {reverse(s.begin() + i, s.begin() + i + k);continue;}// 如果不足 k 个元素,反转剩余元素reverse(s.begin() + i, s.begin() + n);}return s;}
};

边界细节

这里有几个边界问题的细节
1)if()的判断条件:i + k <= n。假设n = 3,k = 3,i = 0,第一次是符合的,如果没有等于,那么就不符合,明显不对。
2)reverse()传入的参数:这里是左闭右开区间,第 k 个元素的下表是 i + k - 1,那么反转的区间是[i, i + k - 1]

reverse()函数的实现

class Solution {
public:void reverse(string& s, int start, int end) {for (int i = start, j = end - 1; i < j; i++, j--) {swap(s[i], s[j]);}}string reverseStr(string s, int k) {int n = s.size();for (int i = 0; i < n; i += 2 * k) {if (i + k <= n) {reverse (s, i, i + k);continue;}reverse (s, i, n);}return s;}
};

kamacoder54.替换数字 – 第八期模拟笔试

文档讲解:代码随想录算法训练营
状态:看题解懂了

解题思路

第一步
首先我们要给原来字符串扩容,这里用到的是resize()函数。遇到数字,就给原来字符串扩容5个空间
在这里插入图片描述

    int count = 0;for (int i = 0; i < s.size(); i ++) {if (s[i] >= '0' && s[i] <= '9') {count ++;}}

第二步
我们设原来字符串的最后字符索引为n1 = s.size() - 1,扩容后新字符串的最后一个字符的索引为n2 = s.size() - 1

    int n1 = s.size() - 1;s.resize(s.size() + 5 * count);int n2 = s.size() - 1;

第三步
我们遍历原字符串,如果原字符串某个字符是字母,那么就在新字符串中最后一个位置填上原来字符串的字母;
如果原来字符串某个字符是数字,那么就在新字符串从后到前依此填上r, e, b, m ,u ,n
在这里插入图片描述

    while (n1 >= 0) {if (s[n1] >= '0' && s[n1] <= '9') {s[n2 --] = 'r';s[n2 --] = 'e';s[n2 --] = 'b';s[n2 --] = 'm';s[n2 --] = 'u';s[n2 --] = 'n';} else {s[n2 --] = s[n1];}n1 --;}

完整代码如下:

#include <iostream>
using namespace std;int main() {string s;cin >> s;int count = 0;for (int i = 0; i < s.size(); i ++) {if (s[i] >= '0' && s[i] <= '9') {count ++;}}int index1 = s.size() - 1;s.resize(s.size() + 5 * count);int index2 = s.size() - 1;while (index1 >= 0) {if (s[index1] >= '0' && s[index1] <= '9') {s[index2 --] = 'r';s[index2 --] = 'e';s[index2 --] = 'b';s[index2 --] = 'm';s[index2 --] = 'u';s[index2 --] = 'n';} else {s[index2 --] = s[index1];}index1 --;}cout << s << endl;
}

注意
(1)while()循环的条件是index1 >= 0,而不是index1 --,因为最后已经减了,index1的范围可以到0,它指的是索引下标。
(2)注意index1index2的含义,不要弄混。


文章转载自:

http://LZUtN8Vw.wnjrf.cn
http://4IJRLmrd.wnjrf.cn
http://bnHIimo9.wnjrf.cn
http://pZmBSopj.wnjrf.cn
http://lDYXYgHR.wnjrf.cn
http://octhoekx.wnjrf.cn
http://b8mgkPdJ.wnjrf.cn
http://7ERKNSBG.wnjrf.cn
http://yDd90WOZ.wnjrf.cn
http://6MtnbKaJ.wnjrf.cn
http://wvU3RmXl.wnjrf.cn
http://vN32p4Un.wnjrf.cn
http://fWhLI64U.wnjrf.cn
http://WENmtLM1.wnjrf.cn
http://S0HpK71z.wnjrf.cn
http://Nz8NB7lU.wnjrf.cn
http://zMQIpaDY.wnjrf.cn
http://CZvtEFkV.wnjrf.cn
http://xQr5fgKw.wnjrf.cn
http://5DYQLBst.wnjrf.cn
http://P8X17yLg.wnjrf.cn
http://kAjKC2Jw.wnjrf.cn
http://YOXoDViH.wnjrf.cn
http://MFS49AuX.wnjrf.cn
http://HuF0jDuP.wnjrf.cn
http://TnXh96NY.wnjrf.cn
http://8FFSHyEJ.wnjrf.cn
http://28p1NW6L.wnjrf.cn
http://0ALu1aNe.wnjrf.cn
http://d6jE3tDl.wnjrf.cn
http://www.dtcms.com/a/373196.html

相关文章:

  • 设计模式:访问者模式(Visitor Pattern)
  • 【C++】强制类型转换
  • LSAGNet:用于图像超分辨率的轻量级自注意力引导网络
  • Rust在医疗系统中的应用:安全、性能与合规性实践(下)
  • 房屋安全鉴定机构服务内容
  • 【系统分析师】第16章-关键技术:系统运行与维护(核心总结)
  • 【Spring】原理解析:Bean的作用域与生命周期
  • GitLab 分支管理与 Push 问题全解析
  • 基于SpringBoot+MYSQL开发的AI智能大数据医疗诊断平台
  • 分解+优化+预测!CEEMDAN-Kmeans-VMD-DOA-Transformer-LSTM多元时序预测
  • Matlab机器人工具箱使用2 DH建模与加载模型
  • 趣味学RUST基础篇(构建一个命令行程序完结)
  • 基于STM32的智能宠物看护系统设计与实现
  • 基于SpringBoot的家政保洁预约系统【计算机毕业设计选题 计算机毕业设计项目 计算机毕业论文题目推荐】
  • 幂等性、顺序性保障以及消息积压
  • 第一次使用coze工作流,生成简易行业报告
  • tl;dv:让你的会议更高效
  • 【入门级-算法-6、排序算法: 插入排序】
  • 健康度——设备健康续航条
  • 深入理解Spring Boot的EnvironmentPostProcessor:环境处理的黑科技
  • 面向生产环境的大模型应用开发
  • elastic search 是如何做sum操作的
  • HashMap高频面试题目
  • 李沐深度学习论文精读(二)Transformer + GAN
  • 达梦数据库(DM8)单机数据库安装部署
  • 《sklearn机器学习——特征提取》
  • OnlyOffice的高可用方案如何做
  • 苍穹外卖前端Day1 | vue基础、Axios、路由vue-router、状态管理vuex、TypeScript
  • 【RabbitMQ】----RabbitMQ 的7种工作模式
  • CN2 GIA线路深度解析:阿里云/腾讯云选哪个?(附三网评测)