将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
示例 1:
示例 2:
示例 3:
public class Test{
public String convert(String s, int numRows) {
String s1=""; // 记录结果
int n = numRows; // 行数
if (n == 1) // 行数为1,直接返回
return s;
for(int i=0;i<n;i++) { // 逐行添加字符
int num = 2*n-2 - 2*i; // 第i行的一个周期内成对字符之间的位置差
int j = i ; // 遍历一个周期内成对字符中的第一个字符
while (j < s.length()) {
s1 += s.charAt(j) ; // 成对字符中的第一个字符
// 第一行和最后一行不存在对应的第二个字符
if (i!= 0 && i!= n-1 && j+num < s.length()){
s1 += s.charAt(j+num); //成对字符中的第二个字符
}
j += 2*n-2; // 下一个周期
}
}
return s1;
}
public static void main(String[] args) {
Test t=new Test();
System.out.println(t.convert("PAYPALISHIRING", 3));
}
}
1. 在第 0和n−1 行,每个循环周期内仅存在一个对应该行的字符
2. 而在第 i (0 < i < n-1)行,每个循环周期内存在两个对应该行的字符