题目描述
将一个给定字符串 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”
解题思路
步骤
(1)将原始字符串按照 "W"(倒"N")型排列;
(2)将重新排列后的字符串按行输出
代码展示
public class Convert {
public static String convert(String s, int numRows) {
// 如果只有 1 行,原样返回
if (numRows == 1) {
return s;
}
StringBuilder[] stringBuilder = new StringBuilder[numRows];
for (int i = 0; i < numRows; i++) {
stringBuilder[i] = new StringBuilder();
}
// 1 表示往下遍历, -1 表示往上遍历
int direction = 1;
int lines = 0;
for (int i = 0; i < s.length(); i++) {
stringBuilder[lines].append(s.charAt(i));
if (lines == 0) {
direction = 1;
}
if (lines == numRows - 1) {
direction = -1;
}
lines += direction;
}
StringBuilder resultString = new StringBuilder();
for (int i = 0; i < numRows; i++) {
resultString.append(stringBuilder[i]);
}
return resultString.toString();
}
public static void main(String[] args) {
String s = "PAYPALISHIRING";
int numRows = 5;
String result = convert(s, numRows);
System.out.println(result);
}
}
图解示例
以题目中所给字符串 s = “PAYPALISHIRING”,numRows = 3 为例,首先需要进行 “W”(倒 “N”)型排列。思路如下:
(1)开辟 numRows 个一维的 StringBuilder[] 数组,分别为:stringBuilder[0], stringBuilder[1], stringBuilder[2],用来存储每一行的字符,变量 lines 作为
stringBuilder[] 的循环变量,lines 初始化为 0;
(2)使用循环变量 i 循环遍历原始字符串 s,将 s 中的每一个字符赋值给符合条件的 stringBuilder[lines] ;
(3)需要一个额外的方向变量 direction 来控制当前字符需要赋值给上面还是下面的 stringBuilder[lines],该方向变量初始化为 1,表示向下赋值,当遍历到 lines = numRows - 1 时,改变方向,使之向上赋值;
当 i = 0 时,lines = 0, 所以 stringBuilder[0] = ‘P’, direction = 1, 所以下一个被赋值的数组应该是 stringBuilder[1];
当 i = 0 时,lines = 1, 所以 stringBuilder[1] = ‘A’, direction = 1, 所以下一个被赋值的数组应该是 stringBuilder[2];
当 i = 0 时,lines = 2, 所以 stringBuilder[2] = ‘Y’, 此时,lines == numRows - 1,所以需要改变方向,即direction = -1, 所以下一个被赋值的数组应该是 stringBuilder[1];
如此循环,最终便得到了W 型的数组:
然后接下来需要做的就是将 stringBuilder[lines] 中的数据拼接即可,于是最终便会得到 PAHNAPLSIIGYIR 的新字符串。