6. ZigZag Conversion

本文详细介绍了一种将字符串以Z字形模式进行转换的算法,通过遍历字符串并确定每个字符所属的行,实现从标准到Z字形布局的转换。文章提供了具体的解决方案,包括确定ZigZag模式的行数、字符的行归属以及最终结果的整合,展示了时间与空间复杂度均为O(n)的高效算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

https://leetcode.com/problems/zigzag-conversion/

Solving Ideas

https://leetcode.com/problems/zigzag-conversion/solution/

遍历字符串,可以轻松确定每个字符所属的ZigZag模式中的哪一行。

  • 使用min(numRows, s.length())确定ZigZag模式的行数
  • 遍历字符串,将每个字符追加当相应行的末端
  • 每个字符所属的行可以由两个变量来确定:curRow (当前行),goingDown (当前移动方向,向上或者向下)
  • 根据题意,goingDown (移动方向)只有在顶部行或者底部行才会改变

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

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

        ArrayList<StringBuilder> sbs = new ArrayList<>(numRows);
        for (int i = 0; i < Math.min(numRows, s.length()); i++) {
            sbs.add(new StringBuilder());
        }

        int curRow = 0;
        boolean goingDown = false;
        for (char ch : s.toCharArray()) {
            sbs.get(curRow).append(ch);
            if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
            curRow += goingDown ? 1 : -1;
        }

        StringBuilder res = new StringBuilder();
        for (StringBuilder sb : sbs) res.append(sb);

        return res.toString();
    }
}

//public class ZigZagConversion {
//    public String convert(String s, int numRows) {
//        if (numRows == 1) return s;
//
//        int unit = 2 * numRows - 2;
//        StringBuilder res = new StringBuilder();
//
//        for (int i = 0; i < numRows; i++) {
//            for (int j = 0; j + i < s.length(); j += unit) {
//                res.append(s.charAt(j + i));
//                if (i != 0 && i != numRows - 1 && j + unit - i < s.length()) {
//                    res.append(s.charAt(j + unit - i));
//                }
//            }
//        }
//        return res.toString();
//    }
//}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值