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

替换所有问号问题通过遍历字符串,对每个问号使用 a-z 字符尝试替换,确保不与前后字符重复。提莫攻击问题计算中毒总时间,通过比较相邻攻击时间差与中毒持续时间,取较小值累加。Z 字形变换问题通过模拟和找规律,将字符串按 Z 字形排列后逐行读取,核心思路是识别以 2*numRows-2 为周期的下标规律,分首行、中间行和末行处理。



模拟遍历过程。从前往后遍历整个字符串,找到问号之后,就用 a~z 的每一个字符去尝试替换即可。
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;
}
};



模拟 + 分情况讨论。 计算相邻两个时间点的差值:
还可以这样想,我们每次加上 min(duration, 差值) 就行。
class Solution {
public:
int findPoisonedDuration(vector<int>& timeSeries, int duration) {
int sum = 0;
for(int i = 0; i < timeSeries.size() - 1; i++) {
sum += min(timeSeries[i + 1] - timeSeries[i], duration);
}
sum += duration;
return sum;
}
};



找规律,用 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)的倍数左右取值。 以此规律,我们可以写出迭代算法。
class Solution {
public:
string convert(string s, int numRows) {
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;
}
};


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online