题目:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3 输出: “LCIRETOESIIGEDHN”
示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4 输出: “LDREOEIIECIHNTSG”
解析
算法思想:通过numRows找到字符串对应行数的规律,再用数组存储将对应行数的字符串,
以示例1为例
P A H N
A P L S I I G
Y I R
思想解析
- 以每次以v字形为一组(例:PAYP/ALIS/HIRI),每一组数量为
2 * numRows - 2 - 每次遍历取余(索引为
i,余数remain = i % (2 * numRows - 2)), - 余数小于numRows的字符串其对应行数等于余数值,直接
push进对应索引数组 - 余数大于等于numRows的字符串,其对应的行数索引为
2 * (numRows - 1) - remain
代码
var convert = function(s, numRows) {
let arr = Array(numRows).fill('')
if (numRows === 1) {
return s
}
for(let i = 0; i < s.length; i++) {
const remain = i % (2 * numRows - 2)
if (remain < numRows) {
arr[remain] += s[i]
} else {
const n = 2 * numRows - 2 - remain
arr[n] += s[i]
}
}
return arr.join('')
}