题目:将一个给定字符串 s
根据给定的行数 numRows
,以从上往下、从左到右进行 Z 字形排列。
步骤示例:
‘1234567’
——>
[1,2,3,4,5,6,7,'']
——>
[
[[1],[2,4],[3]],
[[5],[6,''],[7]]
]
——>
'1524637'
题解:
test(s, numRows) {
if(numRows===1) return s;
let ric = 2 * numRows - 2; //一个循环有几位
let len = ric - (s.length % ric);//len代表还差几位数可以凑满一个循环
let list = s.split('');//将字符串转为数组
for (let i = 0; i < len; i++) {//将剩下位用‘’填满。如[1,2,3,4,5,6,7,'']
list.push('');
}
let leastList = [];
//leastList由每个子循环的列表填充,如[[[1],[2,4],[3]],[[5],[6,''],[7]]]
for (let q = 0; q < list.length; q += ric) {
if (ric + q <= list.length) {
leastList.push(this.fun(list.slice(q, ric + q), numRows, ric));
}
}
let str = '';
for (let m = 0; m <= numRows - 1; m++) {
leastList.forEach((item) => {
str = str + item[m].join('');
});
}
return str
}
/**
*
* @param {*} list
* @param {*} numRows
* @param {*} ric
* @returns 一个循环后的列表
*/
fun(list, numRows, ric) {
let newList = [];
for (let j = 0; j < numRows; j++) {
//头部和尾部进一个值,中间有2值
if (j === numRows - 1 || j === 0) {
newList.push([list[j]]);
} else {
newList.push([list[j], list[ric - j]]);
}
}
return newList;
}