算法---构造zigzag字符串

输入一个字符串,输出其zigzag形式,例如输入"PAYPALISHIRING",要3行
P A H N
A P L S I I G
Y I R
按行读取结果则为"PAHNAPLSIIGYIR"

package reed.kotlindemo.algo


/**
 * Created by thinkreed on 2017/6/25.
 */

fun zigZag(str: String, numRows: Int): String {
/*                n=numRows,zigzag的具体表现如下,先向下numRows个数,再斜向上numRows - 1个数,
    1                           2n-1                         4n-3 第一行的下标差Δ=2 * (n - 1)
    2                     2n-2  2n                    4n-4   4n-2
    3               2n-3        2n+1              4n-5       .
    .           .               .               .            .    中间第i行的下标差则分为两种情况,斜线上的数和前
    .       n+2                 .           3n               .    一个直线上的数差2*(n - i),和后一个直线上的数差2 * (i - 1)
    n-1 n+1                     3n-3    3n-1                 5n-5
    n                           3n-2                         5n-4 最后一行的下标差Δ=2n-2
*/

    if (numRows == 1) return str

    var result = ""

    for (i in 0 until numRows) {

        var k = i
        var j = 0

        while (k < str.length) {
            result += str[k]
            //j为偶数,下标差Δ=2 * (numRows - i - 1),为奇数下标差Δ=2 * i
            k += if (((i == 0) or (j % 2 == 0)) && i != numRows - 1) 2 * (numRows - i - 1) else 2 * i
            j++
        }
    }
    return result
}

你可能感兴趣的:(算法---构造zigzag字符串)