Problem: 6. N 字形变换
思路
观察题目样例中图的规律
解题方法
首先创建一个对象,key为编号。用来存储第一列到第N列的数据、
找出每一个小循环体的长度2*numRows-2
;然后循环字符串,按照规律将每个字符推入对应的数组,最后得到字符数组对象,遍历对象,最后直接拼接,完成~
补充拉跨图一张,因该就恍然大悟了把~
Code
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function (s, numRows) {
if (numRows == 1) return s
//声明一个返回值
let result = "";
//根据排列组合可以看出来一个规律,每 (2*numRows-2)可以看作是一个循环
let circulateNum = 2 * numRows - 2
let strObj = {}
//声明一个对象,用来存储对硬编号下的字符
for (let i = 0; i < numRows; i++) {
strObj[i] = new Array()
}
//开始遍历字符串,给对应的字符串编号
for (let i = 0, curr = 0, reverse = 1; i < s.length; i++) {
//当前循环完成一轮
if (curr % circulateNum == 0 && curr != 0) {
//由于进入这个判断的时候,for循环又对i进行了++操作,如果不执行--,则会跳过下次循环的对一个字符
i--
curr = 0
reverse = 1
} else {
if (curr < numRows) {
strObj[curr].push(s[i])
} else {
//自增倒叙数
reverse++
let index = numRows - reverse
strObj[index].push(s[i])
}
curr++
}
}
for (key in strObj) {
result += strObj[key].join('')
}
//接下来进行凭借
return result;
};