题目:
将一个给定字符串?s
?根据给定的行数?numRows
?,以从上往下、从左到右进行?Z 字形排列。
比如输入字符串为?"PAYPALISHIRING"
?行数为?3
?时,排列如下:
P A H N A P L S I I G Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"
。
思路:
根据Z字形把字符串中每个字符的坐标算出并存起来,遍历存储的坐标,把每一行的字母拼接起来。
代码:
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function (s, numRows) {
if (numRows === 1) return s
let x = 0 // 列
let y = 0 // 行
let way = 1 // 1向下走,-1向上走
let data = [] // 存numRows的每个元素Z字形对应的坐标
for (let i = 0; i < s.length; i++) {
data.push([y, x, s[i]])
way === 1 ? y++ : y--
if (way === -1) {
// 斜着走时x才加
x++
}
if (y === 0) {
way = 1
}
if (y === numRows - 1) {
way = -1
}
}
let res = ''
for (let i = 0; i < numRows; i++) { // 拼接每一行
let row = data.filter(e => e[0] === i).map(e => e[2]).join('')
res += row
}
return res
};