描述:给定字符串,想字符串设定为Z(或者是叫做N)型,而后横向连接起来
比如:var str = 'abcdefgh'
转为Z型行数为3的时候
a e
b d f h
c g
而后将其横向连接起来就变成了:
aebdfhcg
暴力解决
以竖向的为一个数组,将每个字符放入数组,没有字符的以空代替,最后得出一个二维数组,然后将这个二维数组的每一项的第一个元素取出来组成第一行,以此类推,将字符串拼接起来。
var convert = function(s, numRows) {
var item =0;// 表示竖着的每一项
var results = []
var n = numRows
var itemLen = n-1
var index = 0
var count =0
if(s.length<=n|| n-1==0){
return s
}
for(var i=0;i<s.length;i++){
results[item]=results[item]||[]
if(item%(n-1)==0){
count+=1
if(count>n){
item+=1;
count = 0
i=i-1
}else{
index =0
console.log('i',i,item)
results[item].push(s[i])
}
}else{
index+=1;
results[item]=results[item]||[]
for(var j=0;j<n;j++){
results[item].push('')
}
var temp = n-index-1
results[item][temp]=s[i]
item+=1
}
}
var str = ''
for(var i=0;i<n;i++){
results.forEach((item)=>{
str +=item[i]?item[i]:''
})
}
return str;
};
改进算法
上边的暴力解法,太过于复杂,其实数组根本就不需要那么多,只需要一个就好
根据给定的行数n来确定这个数组有多少项。 核心是:计算每一个字符串他应该拼接在数组的那一项的后边。
var convert = function(s, numRows) {
var arrowDown = false;
var index = 0;
var results = [];
for (var i = 0; i < s.length; i++) {
results[index] = results[index] || "";
results[index] += s[i];
if (index == 0 || index == numRows - 1) {
arrowDown = !arrowDown;
}
index += arrowDown ? 1 : -1;
}
var str = ''
results.forEach((item)=>{
str+=item
})
return str;
};
如此代码一下子省了好多