算法- Z字形变换

发布于:2025-02-10 ⋅ 阅读:(43) ⋅ 点赞:(0)

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 数组中的每一行字符拼接起来,得到最终的结果字符串并返回。

网站公告

今日签到

点亮在社区的每一天
去签到