LeetCode 6.Z字形变换

193 阅读1分钟

这是一道找规律的题目

Alt text

下图是一个长度为23的字符串,在行数为5的情况下其元素对应的情况
Alt text

我们将其按规律分割成三部分,相邻部分之间同一位置的元素相差的step = numRows + (numRows - 1)
针对其中一个部分继续分割,可以发现第一行和最后一行都是只有一个元素;而中间有一行中有两个元素
Alt text

对上图继续进行分析可以发现非首尾行元素的第二个元素是(7)等于下一个部分首元素(8)减去非首尾行第一个元素所在行数(1)
于是就可以根据这个规律进行代码的编写了,总体的图片如下
Alt text

var convert = function (s, numRows) {
    if (numRows == 1) {
        return s;
    }
    var len = s.length + numRows-1;
    var step = numRows + (numRows - 2);
    var i,j, result = "";
    for(i=0; i<numRows; i++){
        if(i>0 && i<numRows-1){
            let dis = numRows - i-1;
            for (j = numRows - 1; j < len; j += step) {
                result += s[j-dis] ? s[j - dis] : "";
                result += s[j+dis]?s[j+dis]: "";
            }
        }else if(i == 0 || i == numRows-1){
            j=i;
            while(j<len - numRows + 1){
                result += s[j];
                j+=step;
            }
        }
    }
    return result;
};
var convert = function (s, numRows) {
    if (numRows == 1) {
        return s;
    }
    var len = s.length;
    var step = numRows + (numRows - 2);
    var i,j, result = "";
    for(i=0; i<numRows; i++){
        if(i>0 && i<numRows-1){
            for (j=0; j+i < len; j += step) {
                result += s[j + i];
                if(j+step-i < len){
                    result += s[j + step - i];
                }
            }
        }else if(i == 0 || i == numRows-1){
            j=i;
            while(j<len){
                result += s[j];
                j+=step;
            }
        }
    }
    return result;
};

参考链接: juejin.cn/post/684490…