LeetCode Z字形变换

题目描述

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

javascript 复制代码
P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

请你实现这个将字符串进行指定行数变换的函数:

javascript 复制代码
string convert(string s, int numRows);

示例 1:

输入:s = "PAYPALISHIRING", numRows = 3

输出:"PAHNAPLSIIGYIR"

示例 2:

输入:s = "PAYPALISHIRING", numRows = 4

输出:"PINALSIGYAHRPI"

解释:

javascript 复制代码
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

输入:s = "A", numRows = 1

输出:"A"

解题思路:

1.行数是固定的

2.写入顺序是固定的,下上下上下上。。。。

3.可不可以遍历s的同时,控制上下顺序,写入对应的行,最后合并

4.当字符串长度没有行数多市,为一列,或者行数为1的情况,不需要计算

代码

javascript 复制代码
/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    // 可能存在字符串长度没有行数多的情况,和一行的情况,就直接返回
    if(s.length<=numRows || numRows === 1){return s}
    // 创建一个数组,个数为行数
    const arr = new Array(numRows).fill('')
    // 当前字母对应的行
    let num = 0
    // true 表示向下+ ,false 为向上-
    let plus = true
    for(let i = 0; i<s.length;i++){
        // 每次项当前行里添加字符串
        arr[num] += s[i]

        if(plus){ // 向下行+1
            num += 1
        }else{ // 向上行-1
            num -= 1
        }

        if(num === 0){ // 再次到 0 说明到顶了要向下了,为true
            plus = true
        }
        if(num === numRows-1){ // 再次到 底部 说明要向上了,为false
            plus = false
        }
        
    }
    return arr.join('')
};

代码分析:

这段代码是一个JavaScript函数,名为 convert,其目的是将一个字符串 s 进行Z字形变换,生成一个新的字符串。这个变换通常用于将一个长字符串按照Z字形排列到有限的行数 numRows 中。下面是对这段代码的逐行解释:

  1. var convert = function(s, numRows) {...}: 定义了一个名为 convert 的函数,接受两个参数:字符串 s 和行数 numRows

  2. if(s.length<=numRows || numRows === 1){return s}: 如果字符串的长度小于或等于行数,或者行数为1,直接返回原始字符串,因为不需要变换。

  3. const arr = new Array(numRows).fill(''): 创建一个长度为 numRows 的数组,并将每个元素初始化为空字符串。

  4. let num = 0: 定义一个变量 num 来记录当前字符应该放置的行索引。

  5. let plus = true: 定义一个布尔变量 plus 来控制 num 的增减方向,初始为 true 表示向下移动。

  6. for(let i = 0; i<s.length;i++): 使用一个循环遍历原始字符串 s 的每个字符。

  7. arr[num] += s[i]: 将当前字符添加到数组 arr 的当前行 num 的末尾。

  8. if(plus){ num += 1 } else { num -= 1 }: 根据 plus 的值决定 num 是增加还是减少。

  9. if(num === 0){ plus = true }: 当 num 变为0时,意味着已经到达了数组的最上面一行,接下来应该向下移动,所以将 plus 设置为 true

  10. if(num === numRows-1){ plus = false }: 当 num 变为 numRows-1 时,意味着已经到达了数组的最下面一行,接下来应该向上移动,所以将 plus 设置为 false

  11. return arr.join(''): 最后,将数组 arr 中的所有元素连接起来,形成一个新的字符串,并返回。

这段代码的逻辑是模拟Z字形的路径,从左上角开始,先向下移动,到达底部后向上移动,到达顶部后再次向下,如此循环,直到所有的字符都被放置到数组中。最后,将这个数组的元素按照行的顺序连接起来,形成变换后的字符串。

小知识点:

javascript 复制代码
const arr = new Array(numRows).fill('')

初始化一个4行的数组,每行都是空字符串,用于存放每一行的数值

javascript 复制代码
["", "", "", ""]

在JavaScript中,arr.join('') 是一个字符串操作,用于将数组 arr 中的所有元素连接(join)成一个单一的字符串。这里的 '' 表示连接时不使用任何分隔符。

让我们分解这个操作:

  • arr 是要被连接的数组。
  • join('') 是数组的一个方法,它返回一个由数组中的所有元素组成的新字符串。
    • 第一个参数 ''(空字符串)告诉 join 方法在连接数组元素时不添加任何字符作为分隔。
    • 如果不提供参数,或者参数是一个字符串,那么这个字符串会被用作数组元素之间的分隔符。

例如,如果我们有一个数组 arr = ["Hello", "World", "!"],执行 arr.join('') 将返回字符串 "HelloWorld!"

Z字形字符串变换的上下文中,return arr.join('') 用于将经过Z字形变换后存储在数组 arr 中的每一行连接起来,形成一个单一的字符串,然后返回这个字符串。这样,原本二维的Z字形排列就被转换成了一维的字符串形式,符合题目要求的输出格式。

相关推荐
小刘|22 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
jjyangyou26 分钟前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
van叶~43 分钟前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
简简单单做算法44 分钟前
基于Retinex算法的图像去雾matlab仿真
算法·matlab·图像去雾·retinex
云卓SKYDROID1 小时前
除草机器人算法以及技术详解!
算法·机器人·科普·高科技·云卓科技·算法技术
半盏茶香1 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
徐子童1 小时前
双指针算法习题解答
算法
想要打 Acm 的小周同学呀2 小时前
LRU缓存算法
java·算法·缓存
阑梦清川2 小时前
在鱼皮的模拟面试里面学习有感
学习·面试·职场和发展
劲夫学编程3 小时前
leetcode:杨辉三角
算法·leetcode·职场和发展