将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

    比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

    L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:”LCIRETOESIIGEDHN”。

    请你实现这个将字符串进行指定行数变换的函数:

    string convert(string s, int numRows); 示例 1:

    输入: s = “LEETCODEISHIRING”, numRows = 3 输出: “LCIRETOESIIGEDHN” 示例 2:

    输入: s = “LEETCODEISHIRING”, numRows = 4 输出: “LDREOEIIECIHNTSG” 解释:

    L D R E O E I I E C I H N T S G

    1. 找到每一行的元素位置

      1. 要求分为n行,i为当前行,j为当前列
      2. 每一行的主元素位置是j(2n - 2) + i
      3. 每一行分支元素位置是(j + 1)(2n - 2) - i ```java public class Convert {

        public String convert(String s, int numRows) { //所有元素在一行 if (numRows <= 1) {

        1. return s;

        } int temp = 2 * numRows - 2; //当前行 int i = 0; //当前列 int j = 0; int count = 0; char[] chars = new char[s.length()]; while (i < numRows) {

          //主要元素
          int aIndex;
          while ((aIndex = j * temp + i) < s.length()) {
              chars[count++] = s.charAt(aIndex);
              //分支元素
              int bIndex = (j + 1) * temp - i;
              //第0行,最后一行没有分支元素
              if (bIndex < s.length() && i != 0 && i != numRows - 1) {
                  chars[count++] = s.charAt(bIndex);
              }
              j++;
          }
          i++;
          j = 0;
        

        } return String.valueOf(chars); } }

    
    2. 每一行创建一个容器,按顺序放入元素
    ```java
    public class Convert {
    
        public String convert(String s, int numRows) {
            //所有元素在一行
            if (numRows <= 1) {
                return s;
            }
            int n = Math.min(numRows, s.length());
            //创建容器保存每一行的元素
            List<StringBuilder> stringBuilders = new ArrayList<>(n);
            for (int i = 0; i < n; i++) {
                stringBuilders.add(new StringBuilder());
            }
    
            int next = 0;
            boolean flag = false;
            //按照Z的顺序放入元素
            for (int i = 0; i < s.length(); i++) {
                stringBuilders.get(next).append(s.charAt(i));
                //翻转方向
                if (next == 0 || next == n - 1) flag = ! flag;
                next += flag ? 1 : -1;
            }
            StringBuilder ret = new StringBuilder();
            stringBuilders.forEach(ret::append);
            return ret.toString();
        }
    }