• [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();
        }
    }
    
  • 相关阅读:
    HDU1712:ACboy needs your help(分组背包模板)
    HDU1203:I NEED A OFFER!(01背包)
    HDU1171:Big Event in HDU
    POJ1014:Dividing(多重背包)
    HDU2191-悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包入门)
    hdu2159FATE(二维背包)
    POJ1201 Intervals
    C++之运算符重载
    C++之强制类型转换
    MFC WinInetHttp抓取网页代码内容
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860109.html
Copyright © 2020-2023  润新知