题目:将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”
解析:重点看需要输出的结果!!!!!根据上面的图片可知,其就是需要将字符拆开分别放在 第一列、第二列、第三列、第二列、第一列…然后将放在第一列、第二列、第三列的字符依次进行合并。
要点:定义一个索引index判断当时位于的列数,当index0,位于第一列,且接下来则是第二列、第三列,当indexnumRow-1时;则说明已经位于了第三列,则接下来是第二列、第一列,依次循环。具体代码如下:
解析一:
var convert = function(s, numRows) {
//当numRows为1时直接返回s
if(numRows==1){
return s;
}
//定义一个数组用来保存每列中含有的字符串
//arr=["","","",.....]
let arr =new Array(numRows).fill("");
//down 用来判断是从第一列-->第三列(为true),还是第三列--->第一列(为false)
let down =true;
//index判断当前的所在的列
let index =0;
//依次取出单个s中的单个字符
for(let str of s ){
//将其添加到相应的列中,
arr[index] +=str;
//通过判断确定down的值
if(index ==0){
down =true;
}else if(index ==numRows-1){
down =false;
}
//根据down的值计算出index的值,如果是从第一列-->第三列(为true)则index加1;反之减1
index =down?index+1:index-1;
}
//最后将每列中的字进行合并
let res_str ="";
for(const str of arr){
res_str+=str;
}
return res_str;
};
解析二:此方法来源力扣中该题的热门解析,思想和解析一一样,只是写法不一样
var convert = function(s, numRows) {
if(numRows===1){
return s;
}
let down = true;
let index = 0;
let arr = new Array(numRows).fill('');
arr.forEach.call(s,str=>{
arr[index ]+=str
if(index ==0){
down =true;
}else if(index ==numRows-1){
down =false;
}
index +=down ?1:-1
})
return arr.join('')
};
本文章仅作为个人的学习记录,具体解题思路请查看以下网址!
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion