原文:6. Z 字形变换(LeetCode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-006/

题目描述:

难度:Middle

相关话题:字符串

将一个给定字符串根据给定的行数,以从上往下、从左到右进行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);

示例1:

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

示例2:

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

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

思路:

定义一个rows,它的作用是用来保存每一行的字母,根据题目,可以很轻松的得出第一个字母就在第1行,第二个字母在第2行…第N个字母在第numsRow行;

然后开始往上,第N+1个字母在numsRow-1行…

因此遍历s,并且将每一个字母添加到对应的行中,最后在将每一行字母合并就是结果。

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
  if(numRows===1)return s
  let rows={}
  for(let i=0;i<numRows;i++){
    rows[i]=[]
  }
  let curRow=0,direction=1
  for(let i=0;i<s.length;i++){
    rows[curRow].push(s[i])
    curRow+=direction
    if(curRow===numRows || curRow===-1){
      direction*=-1
      curRow+=2*direction
    }
  }
  // console.log(rows)
  let res=''
  for(let i=0;i<numRows;i++){
    res+=rows[i].join('')
  }
  return res
};