题目描述
将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:
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
解决方法
观察示例可知,往下走要走numRows步,往上走要走numRows-2步(除去头尾,因为和往下走重叠)
模拟Z字遍历字符串
- 往下走numRows步
- 往上走numRows-2步
- 重复1,2直到字符串遍历结束
public String convert(String s, int numRows) {
if (numRows < 2)
return s;
StringBuilder[] sbs = new StringBuilder[numRows];
for (int i = 0; i < numRows; i++)
sbs[i] = new StringBuilder();
int index = 0, len = s.length();
while (index < len) {
for (int row = 0; row < numRows && index < len; row++) // 往下走
sbs[row].append(s.charAt(index++));
for (int row = numRows - 2; row > 0 && index < len; row--) // 往上走
sbs[row].append(s.charAt(index++));
}
for (int row = 1; row < numRows; row++)
sbs[0].append(sbs[row]);
return sbs[0].toString();
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。