leetCode6 Z字形变化

223 阅读1分钟

描述:给定字符串,想字符串设定为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;
};

如此代码一下子省了好多