Z子形变换

77 阅读1分钟

题目

按行访问

public class Main {
    public static void main(String[] args) {

        Main main = new Main();
        main.convert("A", 1);
    }

    public String convert(String s, int numRows) {
        if (s.length() == 1 || numRows == 1) {
            return s;
        }
        // 根据numRows得到基准
        // 例如abcdefgh的基准如下
        // a
        // b   f
        // c e
        // d
        // 之后的g可以由a得到, f由b得到, 以此类推
        // 除了第一行和最后一行 每一行由两个字符作为基准

        int indexOffset = 2 * numRows - 2;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < numRows; i ++) {
            StringBuilder tempStr = new StringBuilder();
            if (i == 0 || i == numRows - 1) {
                int tempIndex = i;
                while (tempIndex < s.length()) {
                    tempStr.append(s, tempIndex, tempIndex + 1);
                    tempIndex += indexOffset;
                }
            } else {
                int tempIndex1 = i;
                int tempIndex2 = i + (numRows - i - 1) * 2;
                while (tempIndex1 < s.length() || tempIndex2 < s.length()) {
                    if (tempIndex1 < s.length()) {
                        tempStr.append(s, tempIndex1, tempIndex1 + 1);
                        tempIndex1 += indexOffset;
                    }
                    if (tempIndex2 < s.length()) {
                        tempStr.append(s, tempIndex2, tempIndex2 + 1);
                        tempIndex2 += indexOffset;
                    }
                }
            }
            sb.append(tempStr.toString());

        }
        return sb.toString();

    }
}

基本思路

  1. 根据题目发现每一行的字符对应在字符串中的索引是有规律的, 这个规律和numsRow有关

  2. 除了首尾两行, 中间行的规律是两个字符一族相关的.

     // 例如abcdefgh的基准如下
     // a
     // b   f
     // c e
     // d
     // 之后的g可以由a得到, f由b得到, 以此类推
     // 除了第一行和最后一行 每一行由两个字符作为基准
    
  3. 每一行字符索引之间的规律, 由索引距离得到, 不要瞎赋予规律