0
点赞
收藏
分享

微信扫一扫

JavaScript Z 字形变换

Yaphets_巍 2022-03-11 阅读 44

leedcode6
题目描述
将一个给定字符串 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”

题目思路:
一个Z的自行变换,直接按照倒Z的写法一步一步代入数组然后返回字符串就好了。开始的思路是——行不断在增加,等到行到了最后一行的时候,列增加的同时行减少,减少到第一行的时候又是列不变化,行不断增加直到结束。但是要先创建空的数组,否则容易出错。
在算的时候会意识到列对于答案并没有什么影响,主要影响是在行。因为每一列的最终合并的字符串并不因其中间的空格而影响,只要顺序对了。

代码部分:

    var convert = function (s, numRows) {
        // s是给定字符串 numRows是要求的行数

        // 如果要求的行数是1的话,字符串没有发生变化,直接返回
        if (numRows === 1) return s;

        // 定义一个二维数组
        let d = [];
        // 创建一个三行的二维空数组
        for (let i = 0; i < numRows; i++) {
            d.push([]);
        }

        let i = 0;//i为行
        let flag = false;//定义控制方向
        for (let k = 0; k < s.length; k++) {
            d[getRows()].push(s[k]);//按照要求将s[k]push进d中
        }
        let ans = '';//定义一个空字符串以返回一个字符串
        d.forEach(function (arr) {
            ans += arr.join('');//数组变字符串
        });
        return ans;

        function getRows() {
            if (i == numRows - 1 || i == 0)//当i在第一行或者最后一行的时候,控制掉头
                flag = !flag;//取反,控制方向
            if (flag) {
                return i++;//如果向下即行增加直到最后一行
            } else {
                return i--;//否则行减少直到第一行
            }
        }
    };

注释比较详细,可以借鉴,以防遗忘

努力学习的一天!

举报

相关推荐

0 条评论