Z 字形变换
6.Z 字形变换
题目分析
题目起初看起来可能有些难以理解,所谓的 z 字形变换是一个倒过来的 Z ,看起来是这样的:|/|/|/|
。
第一想法是使用 n 个字符串来分别存储每一行的字符,最后将这 n 个字符串连接在一起输出即可。
那么首先让我们先观察一下这个 Z 字形排列,假如行数为 4,那么在实际排列的时候,从第一个字母开始存储顺序为:
str[0]-->str[1]-->str[2]-->str[3]-->str[2]-->str[1]--str[0]-->str[1]-->str[2]-->str[3]-->str[2]...
在这个顺序中被加粗的是 Z 字形拐角的位置。所以我们只需要得到 0,1,2,3,2,1,0 这样的数字序列,就可以将每个字符放在应该放入的字符串中了。
首先得到输入数组的长度 len,与划分的行数 n。然后遍历整个字符串。
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function (s, numRows) {
let len = s.length;
numRows = numRows - 1;
let str = [];
if (numRows === 0) return s;
for (let i = 0; i < numRows + 1; i++) {
str[i] = s[i];
}
for (let i = numRows + 1, j = -(numRows - 1); i < len; i++, j++) {
str[j > 0 ? j : -j] += s[i];
if (j % numRows === 0) {
j = -j;
}
}
for (let a of str) {
console.log(a);
}
return str.join("");
};
上述代码中,我们使用了一个数组来存储每一行的字符串,然后遍历整个字符串,将每个字符放入对应的字符串中。 是对于我看到题目的第一想法的实现,最终通过判题之后,效率并不高。
更好的代码实现可以参考 leetcode 官方题解。