将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
示例 3:
输入:s = "A", numRows = 1
输出:"A"
题目本质上是一个字符串相关的问题。我们从左往右遍历字符串的时候,只需要确定该字符串所在的行数即可。我们定义一个变量为currentRow表示当前行,初始化为0。
在遍历的过程中,当前行的往下走,或者往上走。
我们用downDirection表示,当前行的前进方向。如果downDirection为true,则currentRow加一,否则减1。而downDirection在第一行或者最后一行的时候,状态会反转。
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
List<StringBuilder> rows = new ArrayList<>();
for (int i = 0; i < Math.min(numRows,s.length()); i++) {
rows.add(new StringBuilder());
}
boolean downDirection = true;
int currentRow = 0;
for(char c : s.toCharArray()){
rows.get(currentRow).append(c);
// 方向向下
if(downDirection) {
currentRow = currentRow + 1;
} else {
// 方向向上
currentRow = currentRow - 1;
}
// 更新方向
if (currentRow == 0 || currentRow == numRows - 1) {
downDirection = !downDirection;
}
}
StringBuilder result = new StringBuilder();
for(StringBuilder row : rows) {
result.append(row.toString());
}
return result.toString();
}
}