Leetcode 6 Z 字形变换

题目

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例

示例 1:

输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

示例 2:

输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

题解

由于是固定形状的变换,应该有新字符串的下标和老字符串的下标的对应关系。首先分析完整列的字母下标的规律为对于当前为r行c列的字符的下标为(假设最后生成m行的z形状的字符)
(c-1)2(m-1)+r。对角字符的插入的下标为(c-1)2*(m-1)+r+2(m-r)
最终的代码为:

# @param {String} s
# @param {Integer} num_rows
# @return {String}
def convert(s, num_rows)
    if num_rows == 1
        return s
    end
    len = s.length
    result = ""
    skip = 2*(num_rows -1)
    for row in 1..num_rows
        col = 1
        index = (col -1)*skip + row
        while index <= len
            result << s[index - 1]
            if row != 1 and row != num_rows and index + 2*(num_rows - row) <= len
                result << s[index + 2*(num_rows - row) -1]
            end
            col = col + 1
            index = (col -1)*skip + row
        end
    end
    return result
end

你可能感兴趣的:(Leetcode 6 Z 字形变换)