逐步解析力扣6. Z 字形变换(使用布尔控制上下遍历)

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

传参numRows代表上下的行数
在这里插入图片描述
numRows为3时
在这里插入图片描述
numRows为4时

所以要先创建一个布尔,通过numRows来控制布尔

代码

 public String convert(String s, int numRows) {
        if (numRows==1) return s;
        List<StringBuilder> rows = new ArrayList<>();
        for (int i = 0; i < Math.min(numRows,s.length()); i++) {
            rows.add(new StringBuilder());
        }

        int curRow = 0;
        boolean goingDown = false;

        for (char c: s.toCharArray()) {
            rows.get(curRow).append(c);
            if (curRow==0||curRow==numRows-1) goingDown = !goingDown;
            curRow += goingDown? 1:-1;
        }
        StringBuilder result = new StringBuilder();
        for (StringBuilder row:
             rows) {
            result.append(row);
        }
        return result.toString();
    }

第一步,长度为1直接返回没什么好说的
在这里插入图片描述
然后创建一个list,作为一行。第一次遍历的目的是给每一行add一个sb,便于后面append,最后的答案其实就是遍历list取出所有的sb相加
在这里插入图片描述
curRow表示当前行数,goingDown就是前面说的一种思路,通过该布尔来为curRow加加减减,完成z形遍历
在这里插入图片描述
开始给字符串遍历

  1. 取单个字符,给当前行append对应的字符
  2. 如果当前行是最顶上或最底下的行,则布尔取反
  3. 如果从最顶上开始,当前行+1,代表向下遍历;如果从最底下开始,当前行-1,代表向上遍历
    在这里插入图片描述

最后再遍历一次,取出每一行append完的sb,形成新字符串返回
在这里插入图片描述

只需要三次遍历,不管怎么取时间复杂度都是O(n)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值