006Z字形变换

写在前面,参考的是力扣官网的画解算法

一、java代码

/*
 * @lc app=leetcode.cn id=6 lang=java
 *
 * [6] Z 字形变换
 */

// @lc code=start
class Solution {
    public String convert(String s, int numRows) {

        //特别的,如果numrows=1则表示当前字符串即为结果
        if(numRows==1)
            return s;
        
        //判断字符串的数组会不会比给定的行数小
        int len=Math.min(s.length(),numRows);

        //发现StringBuilder 被当做array来使用,
        //StringBuilder[]相当于array of array
        //要按row来进行遍历,每一个row先allocate一个StringBuilder
        String []rows=new String[len];

        //先为每一个row赋空
        for(int i=0;i<len;i++) rows[i]="";

        //定义down,loc
        //loc表示当前字符串数组的下标
        int loc=0;
        //表示是否向下,在第0行和第numRows-1行要变向
        boolean down=false;

        //遍历给定的字符串
        for(int i=0;i<s.length();i++){
            //将当前字符加入当前字符串中
            rows[loc]+=s.substring(i,i+1);

            //考虑给down变向
            if(loc==0||loc==numRows-1)
                down=!down;
            //判断loc是+还是-
            loc+=down?1:-1;
        }

        //最终要输出的结果,先赋空
        String ans="";
        //循环遍历每一行的row,都加到要输出的结果中
        for(String row:rows){
            ans+=row;
        }
        return ans;

    }
}
// @lc code=end


二、字符串思路分析

整体思路

遍历字符串,遍历过程中将每行都看成新的字符串构成字符串数组,最后将该数组拼接起来即可

特别说明

numrows

如果numrows=1,则说明当前字符串即为结果,直接返回
否则,整个字符串需要经历,向下向右,向上向右,这样的反复循环过程

down,loc

设定down变量表示是否向下,loc变量表示当前字符串数组的下标!

如果down为true,则loc+=1,字符串数组下标向后移动,将当前字符加入当前字符串中

如果down为false,则表示向右,则loc-=1,字符串数组下标向前移动,将当前字符加入当前字符串中

时间复杂度O(n)

三、画图解析

拆解:

3.1

3.2

3.3

3.4

3.5

3.6

3.7

3.8

3.9

原文地址:https://www.cnblogs.com/lxr-xiaorong/p/13445488.html