算法- Z字形变换
hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!
function convert(s, numRows) {
// 如果行数为 1 或者行数大于等于字符串长度,直接返回原字符串
if (numRows === 1 || numRows >= s.length) {
return s;
}
// 创建一个长度为 numRows 的数组,用于存储每一行的字符
const rows = new Array(numRows).fill('');
// 当前所在的行索引
let currentRow = 0;
// 方向,1 表示向下,-1 表示向上
let direction = 1;
// 遍历字符串中的每个字符
for (let i = 0; i < s.length; i++) {
// 将当前字符添加到对应的行中
rows[currentRow] += s[i];
// 如果到达第一行,改变方向为向下
if (currentRow === 0) {
direction = 1;
}
// 如果到达最后一行,改变方向为向上
else if (currentRow === numRows - 1) {
direction = -1;
}
// 根据方向更新当前行索引
currentRow += direction;
}
// 将每一行的字符拼接成最终结果
return rows.join('');
}
// 测试示例
const s = "PAYPALISHIRING";
const numRows = 3;
console.log(convert(s, numRows));
代码解释
整体思路
要将字符串按 Z 字形排列后逐行读取,我们可以模拟 Z 字形排列的过程,将每个字符依次放入对应的行中,最后将每一行的字符拼接起来得到结果。具体做法是使用一个数组来存储每一行的字符,通过一个变量记录当前所在的行,另一个变量记录方向(向下或向上),在遍历字符串时根据方向更新当前行。
代码步骤分析
边界条件处理:
- 如果 numRows 为 1 或者 numRows 大于等于字符串 s 的长度,那么 Z 字形排列就是原字符串本身,直接返回 s。
初始化数组和变量:
- 创建一个长度为 numRows 的数组 rows,用于存储每一行的字符,初始时每一项都为空字符串。
- currentRow 表示当前所在的行索引,初始为 0。
- direction 表示方向,1 表示向下, -1 表示向上,初始为 1。
遍历字符串:
- 对于字符串中的每个字符,将其添加到 rows 数组中 currentRow 对应的行。
- 根据当前行的位置更新 direction:如果当前行是第一行(currentRow === 0),则将 direction 设为 1
表示向下;如果当前行是最后一行(currentRow === numRows - 1),则将 direction 设为 -1 表示向上。 - 根据 direction 更新 currentRow,实现行的移动。
拼接结果:
- 遍历结束后,将 rows 数组中的每一行字符拼接起来,得到最终的结果字符串并返回。