关于算法:6-Z-字形变换

42次阅读

共计 1176 个字符,预计需要花费 3 分钟才能阅读完成。

public class ZConvert {

public String convert(String s, int numRows) {int n = s.length(), r = numRows;
    if (r == 1 || r >= n) {return s;}
    StringBuffer[] mat = new StringBuffer[r];
    for (int i = 0; i < r; ++i) {mat[i] = new StringBuffer();}
    // 一个周期元素个数 = numRows + (numRows - 2);
    int t = 2 * (numRows - 1);
    // 指标字符串共须要 (n/t) + 1 个周期
    int tCount = (n/t) + 1;
    // 以后遍历的下标
    int index = 0;
    for (int i = 0; i < tCount; i++) {
        // 以后周期下标 <= 字符串长度
        if (index+t <= n) {
            // 截取以后周期的字符
            processT(s.substring(index, index+t), numRows, t, mat);
        } else {processT(s.substring(index, n), numRows, t, mat);
        }

        index += t;
    }
    StringBuffer ans = new StringBuffer();
    for (StringBuffer row : mat) {ans.append(row);
    }
    return ans.toString();}
public void processT(String sSub, int numRows, int t, StringBuffer[] mat) {
    int count = t;
    // 子串的长度 小于 周期
    if (sSub.length() < t) {
        // 从新赋值子串遍历个数
        count = sSub.length();}
    for(int i = 0; i < count; i++){char ele = sSub.charAt(i);
        // 遍历次数 小于 t-(numRows-2)
        if (i < t-(numRows-2)) {
            // 间接追加以后字符
            mat[i].append(ele);
        }
        if (i >= t-(numRows-2)) {// 遍历次数 大于等于 t-(numRows-2)
            int matIndex = numRows-(i+1)%numRows-1;
            // mat 的下标 = numRows-(i+1)%numRows-1
            mat[matIndex].append(ele);
        }
    }
}

public static void main(String[] args) {
    String s = "PAYPALISHIRING";
    String target = "PAHNAPLSIIGYIR";
    String result = new ZConvert().convert(s, 3);
    Assert.check(target.equals(result), "失败");
    System.out.println("胜利!");
}

}

正文完
 0