06.“之”字形转换
字符串 "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;
};