Z字形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING"
行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
示例:
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
解释:
L D R
E O E I I
E C I H N
T S G
思路:
-
以一个V字形为一个循环,每次循环的次数为n=(2*numRows - 2)
-
有s中每个字符在循环中的位置是x=i % n
-
所属行号为y=min(x,n-x)
-
以上图为例,有如下规则:
-
根据规律可拼接出每一行的的字符串,最后合并所有行即可。
代码:
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function(s, numRows) {
if(numRows == 1){
return s
}
const rows = new Array(numRows).fill("");
console.log(rows)
const n = 2 * numRows - 2;
for(let i = 0; i < s.length; i++) {
const x = i % n;
rows[Math.min(x, n - x)] += s[i];
console.log(rows)
}
return rows.join("");
};
代码解析:
- 如果只有一行,则怎么输入怎么输出
- 如果有多行,先声明一个rows数组有numRows位
- 然后确定每个"V"的次数为n
- 遍历所有的s[i]
- 找到s[i]应该存放的位置放入
- 最后将rows合并即可
循环中输出的rows如下:
[ 'L', '', '', '' ]
[ 'L', 'E', '', '' ]
[ 'L', 'E', 'E', '' ]
[ 'L', 'E', 'E', 'T' ]
[ 'L', 'E', 'EC', 'T' ]
[ 'L', 'EO', 'EC', 'T' ]
[ 'LD', 'EO', 'EC', 'T' ]
[ 'LD', 'EOE', 'EC', 'T' ]
[ 'LD', 'EOE', 'ECI', 'T' ]
[ 'LD', 'EOE', 'ECI', 'TS' ]
[ 'LD', 'EOE', 'ECIH', 'TS' ]
[ 'LD', 'EOEI', 'ECIH', 'TS' ]
[ 'LDR', 'EOEI', 'ECIH', 'TS' ]
[ 'LDR', 'EOEII', 'ECIH', 'TS' ]
[ 'LDR', 'EOEII', 'ECIHN', 'TS' ]
[ 'LDR', 'EOEII', 'ECIHN', 'TSG' ]