LeetCodeランダム-ジグザグ変換


与えられた文字列を与えられた行数に基づいて上から下へ、左から右へとジグザグ配列します。
たとえば、入力文字列が"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
考え方
問題に書いてあるのはジグザグ変換ですが、実際にはN字の順に並べて、それを押して出力します。二つの成長量:
  • 固定成長量があります。値はnumRows*2
  • です。
  • 変動増加量があります。値はi*2
  • です。
    法則を求める:
  • 第0とnumRows-1行で、成長量はnumRows*2
  • です。
  • 他の行、増加定数はnumRows*2-i*2とi*2の交代
  • です。
    コード
    class Solution {
        public String convert(String s, int numRows) {
            if(numRows < 2) {
                return s;
            }
            int finalLength = numRows * 2 - 2;
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < numRows; i++) {
                int index = i;
                int add = i * 2;
                while(index < s.length()) {
                    sb.append(s.charAt(index));
                    add = finalLength - add;
                    index += add == 0 ? finalLength : add;
                }
            }
            return sb.toString();
        }
    }