LeetCode Z字形变换

题目描述

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

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

P   A   H   N
A P L S I I G
Y   I   R

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

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

string convert(string s, int numRows);

示例 1:

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

示例 2:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"

解释:

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的情况,不需要计算

代码

/**
 * @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字形的路径,从左上角开始,先向下移动,到达底部后向上移动,到达顶部后再次向下,如此循环,直到所有的字符都被放置到数组中。最后,将这个数组的元素按照行的顺序连接起来,形成变换后的字符串。

小知识点:

const arr = new Array(numRows).fill('')

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

["", "", "", ""]

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

让我们分解这个操作:

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值