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(); // 注意:原代码缺少结尾分号
}
}