字符串 "PAYPALISHIRING" 用给定的行数按”之”字形写成这样:(为了清晰起见,你可能想用这种固定的字形来展示)

P   A   H   N
A P L S I I G
Y   I   R

然后一行一行地读:"PAHNAPLSIIGYIR"

写出接收一个 string 和给定的行数并且完成转换的代码:

string convert(string s, int numRows);

Example 1:

Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

Example 2:

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:

P     I    N
A   L S  I G
Y A   H R
P     I

解法:

先把 “N” 字形拉成 “V” 形,从第 1 位字母开始,到第 numRows 位为止,行号依次递增放到对应行里面,然后从 numRows 位开始,到第 2 * numRows - 1 位为止,行号递减放到对应行里,这样为一个循环,知道遍历结束。

P     I    N
A   L S  I G
Y A   H R
P     I
------------------分割线---------------------
P     I     N
 A   L S   I G
  Y A   H R
   P     I

代码实现:

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    if(!s) return '';
    let map = {};
    let currentRow = 0;
    let sign = -1;
    let currentRound = numRows - 1; // 第一个字母也是跳变点
    for (let i = 0; i < s.length; i ++) {
        map[currentRow] = (map[currentRow] || '') + s.charAt(i);
        
        if (currentRound == numRows - 1) {
            sign = - sign;
            currentRound = 0;
        }
        currentRow += sign;
        currentRound ++;
    }

    let res = '';
    for (let key in map) {
        res += map[key];
    }
    return res;
};