实现一个将字符串进行指定行数的转换的函数:
将字符串 “PAYPALISHIRING” 以Z字形排列成给定的行数:(下面这样的形状)
之后按逐行顺序依次排列:”PAHNAPLSIIGYIR”
P A H N
A P L S I I G
Y I R
算法思想:
我们先构建一个数组,数组高度为numRows。根据题解,我们可以得到数组中每”两列”是一个循环。
第一列,只增加i,每次增加1
第二列,i每次减1,同时j加1
算法实现
public static String convert(String s, int numRows) {
if (numRows <= 1) {
return s;
}
int w = s.length() % 2== 0 ? s.length() / 2: s.length() / 2 + 1;
char[][] chars = new char[numRows][w];
int j = 0, i = 0;
int pos = 0;
while (pos < s.length()) {
//第一列,只增加i值,每次增加1
while (i < numRows) {
if (pos >= s.length()) {
break;
}
chars[i][j] = s.charAt(pos);
i++;
pos++;
}
i = numRows - 1;
//第二列,i值每次减1,同时j每次增加1
while (i >= 1) {
if (pos >= s.length()) {
break;
}
i = i - 1;
j = j + 1;
chars[i][j] = s.charAt(pos);
pos++;
}
i = 1;
}
StringBuilder sb = new StringBuilder();
for (int m = 0; m < numRows; m++) {
for (int n = 0; n < w; n++) {
if ((int) chars[m][n] != 0) {
sb.append(chars[m][n]);
}
}
}
return sb.toString().trim();
}