6-Z字形变换

 思路:

1.首先要有一个列表rows存储所有的数据,列表里每一个元素代表题中的一行,每一行里面的元素都是不断往里面加进去的,不是初始化好的。所以列表的每个元素,也就是每一行,应该用StringBuilder。按照题意rows总共numRows行,下标是0到numRows-1

2.其次,在边界处如何处理?如题意,假如总共4行,也就是numRows=4。从第一个字符开始,把每一个字符放到rows列表的其中一层,第一个字符第一层,第二个字符第二层。。。行数是递增的。rows总共应该有4层。到第四层时,该转向了,第五个元素,应该放到第3层里。之后第六个在第二层。。。到了行数为1时,又该转为行数递增了。。。所以,用flag表示当前行数递增还是递减,flag为1或者-1.

3.最后,遍历rows里的每一行,建立一个StringBuilder   res,存放最终结果。把每一行都相继append到res里面。因为要返回String类型,要用到StringBuilder的toString()函数。

class Solution {
    public String convert(String s, int numRows) {
        if(numRows==1)return s;
        int flag=-1;//表示行的趋势,是增加还是减少
        int j=0;
        List<StringBuilder> rows=new ArrayList<>();//这个列表存放所有的数据,每个列表元素代表一行,总共numRows行
        for(int i=0;i<numRows;i++)//总共有多少行,就初始化多少个StringBuilder
        {
            rows.add(new StringBuilder());
        }
        
            for(char c:s.toCharArray())//把String变成数组
            {
                if(j==0||j==numRows-1)//此时说明,要么在第一行,要么在最后一行,要转向了
                {
                    flag=-flag;
                }
                rows.get(j).append(c);//根据下标获取ArrayList里面某一行的数据,也就是一个StringBuilder,之后append往里面加字符
                j+=flag;
            }
        
        StringBuilder res=new StringBuilder();//结果集合里需要不断加入数据,而且rows里面每一行都是StringBuilder数据,所以这里res也是StringBuilder
        for(StringBuilder row:rows)
        {
            res.append(row);
        }
        return res.toString();

    }
}

  我的博客里还有ArrayList的用法介绍,虽然是转载的。。。还有StringBuilder的介绍。要是看不懂一些用法,可以看看。

原文地址:https://www.cnblogs.com/lzh1043060917/p/12742277.html