JS算法题之Z 字形变换

摘要:将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 \\\"LEETCODEISHIRING\\\" 行数为 3 时,排列如下:之后,你的输出需要从左往右逐行读取,产生出一个新的字符串

题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);


示例

输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G


解答

这题目的结构有点怪,但也是有规律可循的,我们发现这个”Z“的字符顺序是这样子的:垂直向下,斜向上,然后再垂直向下。
那其实我们可以直接将该结构简化为一个二维数组,去掉中间的空格,再一行一行地遍历就能获取到答案了。
如:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

可以变成

L D R
E O E I I
E C I H N
T S G

接着再一行一行读,拼成字符串,便可。

var convert = function(s, numRows) {
    if(numRows == 1){
        return s;
    }

    let arr = [], direction = 'down', line = 0, str = '';
    for(let i = 0; i < numRows; i++){
        arr[i] = [];
    }

    for(let i = 0; i < s.length; i++){
        arr[line].push(s[i]);

        if(line == 0){
            line++;
            direction = 'down'
        }
        else if(line == numRows - 1){
            line--;
            direction = 'up'
        }
        else{
            if(direction == 'down'){
                line++;
            }
            else if(direction = 'up'){
                line--;
            }
        }
    }

    for(let i = 0; i < numRows; i++){
        str += arr[i].join("");
    }

    return str;
};

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_4709