6. Z 字形变换

2022-02-18  本文已影响0人  Abeants

提示:
1 <= s.length <= 1000
s 由英文字母(小写和大写)、',' 和 '.' 组成
1 <= numRows <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路及方法

方法一

存在规律,对于n行的, s中的第i个字符,对余数进行判断:

i%(2n-2) == 0,为第0行;
i%(2n-2) == 1 || 2n-2-1,为第1行;
i%(2n-2) == 2 || 2n-2-2,为第2行;
...
i%(2n-2) == n-1,为第n-1行;

class Solution {
    public String convert(String s, int numRows) {
        if (numRows == 1) return s;

        List<StringBuilder> rows = new ArrayList<>();
        // 按行存入
        for (int i = 0; i < numRows; i++) {
            StringBuilder row = new StringBuilder();
            int k = 2 * numRows - 2;
            // 遍历字符串
            for (int j = 0; j < s.length(); j++) {
                if (j % k == i || j % k == k - i) {
                    row.append(s.charAt(j));
                }
            }
            rows.add(row);
        }

        String res = "";
        for (StringBuilder sb : rows) {
            res  = res + sb.toString();
        }

        return res;
    }
}

结果如下:

方法二

可以使用按行填充的方法,将复杂度降到O(n)。
step代表步数,当遇到第一行和最后一行就逆着步子填充。

class Solution {
    public String convert(String s, int numRows) {
        if (numRows == 1) return s;

        List<StringBuilder> rows = new ArrayList<>();
        // 构建行
        for (int i = 0; i < numRows; i++) {
            rows.add(new StringBuilder());
        }
        // 按行存储
        int row = 0, step = -1;
        for (char ch : s.toCharArray()) {
            // 第一行和最后一行逆序
            if (row == 0 || row == numRows - 1) step = -step;
            // 填充
            rows.get(row).append(ch);
            row += step;
        }
        // 构建字符串
        StringBuilder res = new StringBuilder();
        for (StringBuilder sb : rows) {
            res.append(sb);
        }
        
        return res.toString();  
    }
}

结果如下:

上一篇 下一篇

猜你喜欢

热点阅读