• 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的介绍。要是看不懂一些用法,可以看看。

  • 相关阅读:
    SQL server 插入不同IP的数据库
    SQL Server中的循环例子(网摘)
    C#小型数据库只能查询
    vue.prototype和vue.use的区别和注意点
    Ajax+PHP简单入门教程
    smarty在windows下的安装
    docker安装mysql镜像和容器
    Linux导出未越狱Iphone10.3QQ聊天记录
    记一次Struts中文乱码
    Ubuntu设置服务开机启动
  • 原文地址:https://www.cnblogs.com/lzh1043060917/p/12742277.html
Copyright © 2020-2023  润新知