ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode6.Z字形变换 详解

2021-05-07 10:04:08  阅读:202  来源: 互联网

标签:LeetCode6 字符 字形 添加 StringBuffer direct 详解 字符串 curRow


LeetCode6.Z字形变换

题目描述

/**
     * 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
     * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
     *
     * P   A   H   N
     * A P L S I I G
     * Y   I   R
     * 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
     * 请你实现这个将字符串进行指定行数变换的函数:
     */

思路分析

 //思路分析:
    //1. 先确定这个字符串展开后的最少行数,原则上是numRows,
    //   但是如果s.length < numRows,那么展开是最少行数应该为 s.length
    //2. 确定好展开的行数后,考虑这些字符在每行如何存储,可以考虑使用字符串长度可变的StringBuffer来存储每一行
    //   然后将每一行的StringBuffer存放在一个List集合中
    //3. 考虑这些字符如何Z字形存储的问题,因为最后要打印按行存储的字符串,所以在存储字符的时候不用考虑存储后的形状,
    //   只需要将字符存入指定的行即可
    //4. 定义两个指针 curRow指向当前行,direct 表示添加字符的方向,
    //   假定direct = true表示向下添加字符,direct = false,表示向上添加字符,
    //   当direct指向第一行或者最后一行时,改变方向
    //5. 字符添加完毕后,遍历集合中的StringBuffer即可
	//6. 详解见源码

源码及分析

/**
     * @param s       给定的字符串S
     * @param numRows 给定的字符串按照多少行进行Z字形展开
     * @return
     */
    public String convert(String s, int numRows) {
        //先进行数据校验
        if (numRows == 1) {
            return s;
        }

        //拿到Z自行变换的行数
        int min = Math.min(s.length(), numRows);
        //总共有min行,第一行索引为0,最后一行索引为 min - 1

        //创建存储StringBuffer的集合
        ArrayList<StringBuffer> list = new ArrayList<>();

        //向每行添加一个StringBuffer容器
        for (int i = 0; i < min; i++) {
            list.add(new StringBuffer());
        }

        //定义两个指针curRow和direct
        //默认刚开始在第一行,往下走
        int curRow = 0;
        boolean direct = true;

        //遍历字符串的字符,向指定位置添加字符
        for (char c : s.toCharArray()) {

            //如果向下添加
            if (direct) {
                //向当前可变字符串中添加字符
                list.get(curRow).append(c);
                //每添加依次,当前行+1
                curRow++;
                //判断是否到达最后一行
                if (curRow == min) {
                    //如果到达最后一行,改变direct的方向,重置当前行curRow
                    direct = false;
                    curRow -= 2;
                }
            } else {
                //向下添加
                list.get(curRow).append(c);
                //每添加一个字符,当前行-1
                curRow--;
                //判断是否到达第一行
                if (curRow == -1) {
                    //如果到达第一行,改变方向,重置当前行
                    direct = true;
                    curRow += 2;
                }
            }
        }
        //循环结束后所有的字符已经按z自行变换添加完毕
        //拿到字符串返回即可
        StringBuffer stringBuffer = new StringBuffer();
        for (StringBuffer buffer : list) {
            //字符串拼接
            stringBuffer = stringBuffer.append(buffer);
        }
        //测试
        //stringBuffer = list.get(1);
        return new String(stringBuffer);
    }

标签:LeetCode6,字符,字形,添加,StringBuffer,direct,详解,字符串,curRow
来源: https://www.cnblogs.com/mx-info/p/14737825.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有