LeetCode 6 Z字形变换

题目:

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

比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:


P   A   H   N
A P L S I I G
Y   I   R

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

解题:

两列分成一组,第一列为0~n,第二列为n-1~1,然后把他们放入数组合并即可,一行时直接返回原字符串

代码:


func convert(s string, numRows int) string {
    if numRows == 1 {
        return s
    }
    strArr := make([]string, numRows)
    l := 2*numRows - 2
    for i := range s {
        j := i % l
        if j < numRows {
            strArr[j] = strArr[j] + string(s[i])
        } else {
            strArr[l-j] = strArr[l-j] + string(s[i])
        }
    }
    return strings.Join(strArr, "")
}

官方解答:

func convert(s string, numRows int) string {
    n, r := len(s), numRows
    if r == 1 || r >= n {
        return s
    }
    t := r*2 - 2
    ans := make([]byte, 0, n)
    for i := 0; i < r; i++ { // 枚举矩阵的行
        for j := 0; j+i < n; j += t { // 枚举每个周期的起始下标
            ans = append(ans, s[j+i]) // 当前周期的第一个字符
            if 0 < i && i < r-1 && j+t-i < n {
                ans = append(ans, s[j+t-i]) // 当前周期的第二个字符
            }
        }
    }
    return string(ans)
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注