《算法题讲解指南:优选算法-模拟》--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

爆肝 2 天,用 GLM5 开发了 OpenClaw 接入微信 bot,已开源!

爆肝 2 天,用 GLM5 开发了 OpenClaw 接入微信 bot,已开源!

这是苍何的第 493 篇原创! 大家好,我是苍何。 OpenClaw,这个 GitHub 上 18 万 Star 的怪物级开源项目,你们应该都听过了吧? 飞书能接、钉钉能接、企业微信能接、QQ 能接、Discord 能接…… 但偏偏最多人用的「微信个人号」,它不支持。 我翻遍了 GitHub、掘金、知乎,找到的方案要么是企业微信绕一圈,要么是用微信 Web 协议搞,动不动就封号。 说实话,这谁顶得住? 天天在微信上跟朋友聊天、在群里吹水,结果想接个 OpenClaw 都这么费劲? 麻了。 于是我决定自己干。 「爆肝 2 天,我把 OpenClaw 接入了微信个人号,并且已经开源了。」 地址:

By Ne0inhk
Git:如何将一个分支的特定提交合并到另一个分支?

Git:如何将一个分支的特定提交合并到另一个分支?

了解更多,关注微信公众号 「思客潘」 Git:将一个分支的特定提交合并到另一个分支的完整指南 一、Git 提交合并的基本方法 1.1 使用 cherry-pick(最常用方法) 适用场景:将某个分支的单个或多个指定提交应用到当前分支。 # 基本语法git cherry-pick <commit-hash># 示例:将feature分支的提交应用到main分支# 1. 首先切换到目标分支git checkout main # 2. 查看要合并的提交IDgit log --oneline --graph feature # 3. 选择并合并特定提交git cherry-pick abc123def # 4. 合并多个不连续的提交git cherry-pick abc123def 789xyz01 # 5. 合并连续范围的提交(左开右闭)git cherry-pick start-commit^..end-commit # 例如:合并从A到B的所有提交(

By Ne0inhk
OpenCode 免费模型深度评测:四大开源模型场景化对比与选型指南

OpenCode 免费模型深度评测:四大开源模型场景化对比与选型指南

在开源大语言模型(LLM)生态中,OpenCode 凭借其多样化的免费模型矩阵(如 Trinity Large Preview、Big Pickle、MiniMax M2.5 Free、GPT-5 Nano)吸引了开发者与企业的广泛关注。本文将从技术架构、性能表现、适用场景等维度,深度解析这四大模型的差异化优势,并提供选型建议。 1. Trinity Large Preview:超大规模稀疏模型的“创意引擎” 开发者:Arcee AI 核心架构:400B 参数稀疏混合专家(MoE)架构,每 token 仅激活 13B 参数 上下文窗口:512K tokens(约 75 万字) 适用场景:创意写作、

By Ne0inhk

【GitHub项目推荐--开源游戏列表】

Trilarion/opensourcegames: Technical infos of open source games. 网站地址:OSGL OSGL(开源游戏列表)是一份开源游戏、游戏框架和游戏制作工具的列表。这些项目至少处于测试阶段,代码基础会构建成可执行演示。代码必须属于自由开源软件(FOSS)允许他人修改和分享的许可。每条条目都会收集相关信息,包括 代码仓库、下载功能和构建说明。 游戏 (1801)- 工具 (49)- 框架 (66)- 库 (16) 按类别分类: 动作 (357)、 冒险 (66)、 街机 (221)、 棋盘 (28)、 卡牌 (26)、 教育(14)、 框架 (66)、 游戏引擎

By Ne0inhk