美文网首页
6. Z 字形变换

6. Z 字形变换

作者: Abeants | 来源:发表于2022-02-18 00:18 被阅读0次

提示:
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();  
    }
}

结果如下:

相关文章

  • Python算法-模拟过程实现算法

    6. Z 字形变换[https://leetcode-cn.com/problems/zigzag-convers...

  • 6. Z字形变换

    一、题目原型: 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:输入: s = "PAYPA...

  • 6. Z 字形变换

    题目描述 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 示例 解题思路1 顺序思维,先...

  • 6. Z字形变换

    难度:中等将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:P A H NA...

  • 6. Z 字形变换

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

  • 6. Z 字形变换

    题目:https://leetcode-cn.com/problems/zigzag-conversion/[ht...

  • 6. Z 字形变换

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

  • 6. Z 字形变换

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

  • LeetCode-6 Z字形变换

    题目:6. Z字形变换 难度:中等 分类:字符串 解决方案:字符串遍历 今天我们学习第6题Z字形变换,这是一个字符...

  • 字符串 - Z字变形

    6. Z 字形变换 题目描述 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字...

网友评论

      本文标题:6. Z 字形变换

      本文链接:https://www.haomeiwen.com/subject/eaeelrtx.html