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

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务并全面实现无损语言壁垒交互 前言 在 OpenHarmony 应用向高性能计算领域扩展的过程中,如何优雅地接入已有的 C/C++ 算法库(如加密引擎、重型图像处理、数学模拟)而又不失跨平台的便捷性?传统的 NAPI 虽然稳健,但在 Flutter 生态中,直接利用 WebAssembly (WASM) 配合 FFI(External Function Interface)的语义可以在一定程度上实现代码的高度复用。wasm_ffi 库为 Flutter 开发者提供了一套在 Dart 环境下调用 WASM

By Ne0inhk
三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

文章目录 * **第一部分:引言与核心密码学概念** * **1.1 为什么IM需要端到端加密(E2EE)?** * **1.2 核心密码学概念与工具** * **第二部分:方案一:静态非对称加密(基础方案)** * **2.1 方案概述与流程** * **2.2 前端Vue实现(使用node-forge)** * **1. 安装依赖** * **2. 核心工具类 `crypto.js`** * **3. Vue组件中使用** * **2.3 后端Java实现(Spring Boot)** * **1. 实体类** * **2. Controller层** * **3. WebSocket配置** * **2.4 密钥管理、注册与登录集成** * **1. 用户注册/登录时生成密钥** * **2. 密钥设置页面** * **2.

By Ne0inhk
前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

在 AI 辅助编程领域,长期以来似乎存在一条不成文的铁律:如果你想要最好的结果,就必须为最昂贵的模型买单(通常是 Anthropic 或 OpenAI 的旗舰模型)。然而,随着国产大模型如 GLM 4.7 和 MiniMax M2.1 的迭代,这一格局正在发生剧烈震荡。 最近,一场针对Claude Opus 4.5、Gemini 3 Pro、GLM 4.7 和 MiniMax M2.1 的前端 UI生成横向测评,打破了许多人的固有认知。在这场包含落地页、仪表盘、移动端应用等五个真实场景的较量中,不仅出现了令人咋舌的“滑铁卢”,更诞生了性价比极高的“新王”。 本文将深入拆解这场测试的细节,透过代码生成的表象,探讨大模型在工程化落地中的真实效能与成本逻辑。

By Ne0inhk
【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * JavaScript 正则表达式详解 * 什么是正则表达式🤔 * JavaScript 正则表达式的定义与使用🥝 * 1. 字面量语法 * 2. 常用匹配方法 * test() 方法🍋‍🟩 * exec() 方法🍋‍🟩 * 正则表达式的核心组成部分🐦‍🔥 * 1. 元字符 * 边界符 * 量词 * 字符类 * 2. 修饰符 * 简单示例🍂 JavaScript 正则表达式详解 正则表达式是处理字符串的强大工具,在 JavaScript 中被广泛应用于表单验证、文本处理和数据提取等场景。本文将从正则表达式的基本概念出发,详细介绍其语法规则和实际应用方法。 什么是正则表达式🤔 正则表达式是用于匹配字符串中字符组合的模式,在 JavaScript

By Ne0inhk