[LeetCode]6.Z 字形变换

题目描述

在这里插入图片描述
在这里插入图片描述

方法

  • 按行排序

个人理解:

  • numRows个StringBuilder对象代表numRows
  • 使用一个curRow变量用于跟踪当前行,用一个goingDown变量跟踪遍历方向(curRow++还是--
  • 顺序遍历字符串字符,将字符添加到对应的行(StringBuilder对象)中
  • 整合所有的行(StringBuilder对象),并输出
class Solution {
    public String convert(String s, int numRows) {
        //如果行数为1行,返回原字符串
        if(numRows == 1) return s;
        //定义一个列表用于存储每一行
        List<StringBuilder> rows = new ArrayList<>();
        //使用min(numRows, s.length()代表非空行数是因为字符串长度可能小于行数
        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 ret = new  StringBuilder();
        for(StringBuilder row : rows)ret.append(row);
        return ret.toString();
    }
}
  • 按行访问

个人理解:

  • 第一行Z型两竖边上的字符间隔为cycleLen = 2 * numRows - 2
  • i遍历每一行,j 代表第一行Z型竖边上的字符的下标,j+i 代表第i行Z型竖边上的字符的下标’j+i<n,每一行两竖边之间只有一个字符,该字符的下标为 j + cycleLen - i < n
  • 按行遍历,根据i添加字符
    在这里插入图片描述
class Solution {
    public String convert(String s, int numRows) {
        //字符串长度
        int n = s.length();
        if(numRows == 1) return s;
        //定义字符间隔cycleLen
        int cycleLen = 2 * numRows - 2;
        //用于存储字符串
        StringBuilder res = new StringBuilder();
        //两层循环,i代表行数,j代表第一行相隔cycleLen的字符下标,
        //j+i代表第i行相隔cycleLen的下标,j+cycleLen - i代表间隔中间的字符
        for(int i = 0; i < numRows; i++) {
            for(int j = 0; j + i < n; j += cycleLen) {
                res.append(s.charAt(j+i));
                if(i != 0 && i != numRows - 1 && j + cycleLen - i < n) {
                    res.append(s.charAt(j + cycleLen - i));
                }
            }
        }
        return res.toString();
    }
}
posted @ 2019-11-30 14:44  消灭猕猴桃  阅读(93)  评论(0编辑  收藏  举报