《算法题讲解指南:优选算法-模拟》--38.替换所有问号,39.提莫攻击,40.Z 字形变换

《算法题讲解指南:优选算法-模拟》--38.替换所有问号,39.提莫攻击,40.Z 字形变换

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

38.替换所有问号

题目链接:

题目描述:

题目示例:

解法(模拟):

算法思路:

C++算法代码:

算法总结及流程解析:

39.提莫攻击

题目链接:

题目描述:

题目示例:

解法(模拟+分情况讨论):

算法思路:

C++算法代码:

算法总结及流程解析:

40.Z 字形变换

题目链接:

题目描述:

题目示例:

解法(模拟+找规律):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


38.替换所有问号

题目链接:

1576. 替换所有的问号 - 力扣(LeetCode)

题目描述:

题目示例:

解法(模拟):

算法思路:

      就是模拟这个过程就行。从前往后遍历整个字符串,找到问号之后,就用 a~z 的每一个字符去尝试替换即可。 

C++算法代码:

class Solution { public: string modifyString(string s) { for(int i = 0; i < s.size(); i++) { if(s[i] == '?') { for(char c = 'a'; c <= 'z'; c++) { if((i == 0 || s[i - 1] != c) && (i == s.size() - 1 || s[i + 1] != c)) { s[i] = c; break; } } } } return s; } };

算法总结及流程解析:

39.提莫攻击

题目链接:

495. 提莫攻击 - 力扣(LeetCode)

题目描述:

题目示例:

解法(模拟+分情况讨论):

算法思路:

      模拟+分情况讨论。
      计算相邻两个时间点的差值:

  • 如果差值大于等于中毒时间,说明上次中毒可以持续 duration 秒。
  • 如果差值小于中毒时间,那么上次的中毒只能持续两者的差值

      还可以这样想,我们每次加上 min(duration,差值) 就行。

C++算法代码:

class Solution { public: int findPoisonedDuration(vector<int>& timeSeries, int duration) { int sum = 0; for(int i = 0; i < timeSeries.size() - 1; i++) { // if(timeSeries[i + 1] - timeSeries[i] >= duration) // { // sum += duration; // } // else // { // sum += timeSeries[i + 1] - timeSeries[i]; // } sum += min(timeSeries[i + 1] - timeSeries[i], duration); } sum += duration; return sum; } };

算法总结及流程解析:

40.Z 字形变换

题目链接:

6. Z 字形变换 - 力扣(LeetCode)

题目描述:

题目示例:

解法(模拟+找规律):

算法思路:

      找规律,用 row 代替行数,row = 4 时画出的 N 字形如下:
0 2row - 2 4row - 4
1 2row - 3 2row - 1 4row - 5 4row - 3
2 2row-4 2row 4row - 6 4row - 2
3 2row + 1 4row - 1

      不难发现,数据是以 2row - 2 为⼀个周期进行规律变换的。将所有数替换成用周期来表示的变量:
第一行的数是:0, 2row - 2, 4row - 4;
第二行的数是:1, (2row - 2) - 1, (2row - 2) + 1, (4row - 4) - 1, (4row - 4) + 1;
第三行的数是:2, (2row - 2) - 2, (2row - 2) + 2, (4row - 4) - 2, (4row - 4) + 2;
第四行的数是:3, (2row - 2) + 3, (4row - 4) + 3。

      可以观察到,第一行、第四行为差为 2row - 2 的等差数列;第二行、第三行除了第⼀个数取值为行数,每组下标为(2n - 1, 2n)的数围绕(2row - 2)的倍数左右取值。
      以此规律,我们可以写出迭代算法。

C++算法代码:

class Solution { public: string convert(string s, int numRows) { // string ret; // int d = 2 * numRows - 2; // if(d == 0) // { // return s; // } // for(int i = 0; i < numRows; i++) // { // int j = i; // int flag = 0; // if(i == numRows - 1) // { // flag = 1; // } // while(j < s.size()) // { // ret.push_back(s[j]); // if(flag == 0) // { // j += (d - 2 * i); // if(i != 0) // { // flag = 1; // } // } // else // { // j += (2 * i); // if(i != numRows - 1) // { // flag = 0; // } // } // } // } // return ret; //代码优化: string ret; int d = 2 * numRows - 2; if(d == 0) { return s; } //1、处理第一行 for(int i = 0; i < s.size(); i += d) { ret.push_back(s[i]); } //2、处理中间行 for(int k = 1; k < numRows - 1; k++)//枚举中间每一行 { for(int i = k, j = d - k; i < s.size() || j < s.size(); i += d, j += d) //这里用或是保证一行全部遍历完再到下一行,避免漏掉 { //由于是或,所以可能出现其中一个越界的情况,需要判断 if(i < s.size()) { ret.push_back(s[i]); } if(j < s.size()) { ret.push_back(s[j]); } } } //3、处理最后一行 for(int i = numRows - 1; i < s.size(); i += d) { ret.push_back(s[i]); } return ret; } };

算法总结及流程解析:

结束语

      到此,38.替换所有问号,39.提莫攻击,40.Z 字形变换 这三道算法题就讲解完了。替换所有问号(1576题):通过遍历字符串,对每个问号使用a-z字符尝试替换,确保不与前后字符重复。提莫攻击(495题):计算中毒总时间,通过比较相邻攻击时间差与中毒持续时间,取较小值累加。Z字形变换(6题):通过模拟和找规律,将字符串按Z字形排列后逐行读取。核心思路是识别以2*numRows-2为周期的下标规律,分首行、中间行和末行处理。 希望大家能有所收获!

Read more

C++ —— 哈希详解 - 开散列与闭散列

C++ —— 哈希详解 - 开散列与闭散列

江河入海,知识涌动,这是我参与江海计划的第6篇。 目录 1. 哈希的概念 1.1 直接定址法 1.2 哈希冲突  1.3 负载因子 1.4 哈希函数  1.4.1 除法散列法/除留余数法   1.4.2 乘法散列法  1.4.3 全域散列法 1.5 处理哈希冲突 1.5.1 开放定址法(闭散列) 1. 线性探测(挨着查找) 2. 二次探测(跳跃着查找) 3. 双重散列 2. 闭散列实现哈希表 2.

By Ne0inhk

Visual C++ 6.0中文版安装包下载教程及win11安装教程

本文分享的是Visual C++ 6.0(简称VC++6.0)中文版安装包下载及安装教程,关于win11系统下安装和使用VC++6.0使用问题解答,大家在安装使用的过程中会遇到不同的问题,如遇到解决不了的问题请给我留言! 一、安装包的下载 vc6.0安装包下载连接: https://pan.quark.cn/s/710dc0efe636 二、安装vc++6.0 1.鼠标右键解压到“VC++ 6.0”安装包,解压后如图所示: 2.双击Steup.exe,进行安装; 3.点击下一步 4.更改路径,建议不要安装在C盘(默认盘符),可以选择其他的盘符,点击浏览进行更改盘符。 5.选择C盘(默认盘或系统盘)以外的盘符。

By Ne0inhk
C++ 继承入门(下):友元、静态成员与菱形继承的底层逻辑

C++ 继承入门(下):友元、静态成员与菱形继承的底层逻辑

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 前言 一. 友元 —— 友元关系不可继承   1、错误版本   2、正确版本 二. 静态成员 —— 继承体系中静态成员的共享性 三. 多继承及菱形继承问题:本质特点与解决方案   1、单继承与多继承模型   2、菱形继承:虚继承解决“数据冗余”与“二义性”     2.1 菱形继承出现的坑(解决二义性问题)     2.2 虚继承:彻底解决菱形继承问题     3、多继承中指针偏移问题 友元,静态成员,

By Ne0inhk
C++之基于正倒排索引的Boost搜索引擎项目介绍

C++之基于正倒排索引的Boost搜索引擎项目介绍

1. 为什么我们要写项目 1.1 把理论知识转化为实际能力 计算机专业的课程(如编程语言、数据结构、算法、操作系统等)多以理论和抽象概念为主,而项目是 “用起来” 的过程。比如学了数据结构中的链表、树,只有在做通讯录管理系统、文件索引工具等项目时,才能真正理解它们在实际场景中的作用;学了多线程,在开发简单的并发程序(如聊天软件)时,才会明白锁机制、线程同步的实际意义。 1.2 培养解决复杂问题的思维 项目开发中总会遇到各种 “意料之外” 的问题:代码逻辑漏洞、性能瓶颈、兼容性问题等。解决这些问题的过程,能倒逼你学会拆解问题、查阅文档(如官方手册、技术博客)、调试代码(用 IDE 断点、日志分析),甚至借鉴开源项目的思路 —— 这些都是未来工作中不可或缺的 “实战思维”。 1.3 理解完整的开发流程

By Ne0inhk