当前位置: 首页 > article >正文

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

http://www.kler.cn/a/523812.html

相关文章:

  • sem_wait的概念和使用案列
  • python:斐索实验(Fizeau experiment)
  • 【Rust自学】14.6. 安装二进制crate
  • STM32 TIM输入捕获 测量频率
  • MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询
  • Linux基础指令
  • Java实现FIFO缓存策略实战
  • 为什么应用程序是特定于操作系统的?[计算机原理]
  • MFC 创建Ribbon样式窗口
  • NLP模型大对比:Transformer(Bert) > RNN > n-gram
  • Linux 常用命令——系统设置篇(保姆级说明)
  • 2024.12.28测试 总结
  • Redisson分布式限流的使用及原理
  • mybatis(104/134)
  • Ubuntu x64下交叉编译ffmpeg、sdl2到目标架构为aarch64架构的系统(生成ffmpeg、ffprobe、ffplay)
  • Lustre Core 语法 - 算术表达式
  • 使用 C/C++ 调用 libcurl 调试消息
  • Qt Ribbon使用实例
  • SSRF漏洞学习总结
  • 【JS逆向】前端加密对抗基础
  • Java定时任务实现方案(四)——Spring Task
  • 卡特兰数学习
  • MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题
  • vue中的el是指什么
  • 广域网PPP协议
  • Java学习教程,从入门到精通,JDBC插入记录语法及案例(104)