6.Z 字形变换

class Solution {
    public String convert(String s, int numRows) {
        // 处理行数为1的特殊情况(无需变换直接返回)
        if (numRows == 1) {
            return s;
        }

        // 初始化每行的字符串容器(注意:Java数组需用Arrays.fill初始化)
        String[] stringArray = new String[numRows];
        Arrays.fill(stringArray, ""); // 填充空字符串
        char[] chars = s.toCharArray(); // 转为字符数组操作更高效

        // 计算Z字形周期长度(完整V型结构的字符数)
        // 公式推导:向下走numRows步 + 斜向上走numRows-2步 = 2*numRows-2
        int period = numRows * 2 - 2;

        // 遍历每个字符进行分配
        for (int i = 0; i < chars.length; i++) {
            int mod = i % period; // 计算当前字符在周期中的位置
            
            // 判断当前字符所在位置:
            if (mod < numRows) {
                // 处于Z字形的垂直下降阶段,直接对应行号
                stringArray[mod] += chars[i];
            } else {
                // 处于Z字形的斜线上升阶段,需计算反向行号
                // period-mod 的效果示例:当numRows=4时,mod=4对应索引0,mod=5对应索引1
                stringArray[period - mod] += chars[i];
            }
        }

        // 合并所有行的字符串
        StringBuilder result = new StringBuilder();
        for (String substr : stringArray) {
            result.append(substr);
        }
        return result.toString(); // 注意:原代码缺少结尾分号
    }
}
posted @ 2025-05-19 15:17  星星永远发着光  阅读(7)  评论(0)    收藏  举报