[LeetCode6. Z 字形变换] | 刷题打卡

146 阅读1分钟

一、题目描述:

leetcode-cn.com/problems/zi… 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

****示例 1:

输入:s = "PAYPALISHIRING", numRows = 3
P   A   H   N
A P L S I I G
Y   I   R
输出:"PAHNAPLSIIGYIR"

二、思路分析:

  • 开辟一个长度为行数的数组用于保存,没行进行z字变化后的字符串解
  • 每一个循环处理一个最小单元的字符串,即一个垂直与y轴的字符串与一个斜着的字符串,最小单元的字符串长度为2*numRows - 2
  • 分类处理,两种情况:
    • 一种是垂直与y轴的,这种行数为numRows
    • 另一种为斜着的,这种行数为numRows - 2

三、AC 代码:

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function (s, numRows) {
    const sArr = new Array(numRows).fill("")

    let nIndex = 0

    while(nIndex < s.length){
        for(let i=0;i<numRows && nIndex<s.length;i++){
            sArr[i]+=s[nIndex]
            nIndex++
        }
        for(let i = numRows-2;i>=1 && nIndex<s.length;i--){
            sArr[i]+=s[nIndex]
            nIndex++
        }
    }


    return sArr.reduce((acrr,curr)=>{
        return acrr+curr
    },"")

};

四、总结:

  • 找规律,先求最小单元的解,最后推导总答案