本题来自LeetCode:6. Z 字形变换[1]
题目描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:”LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
题目分析
本题采用模拟法,依次将字符串的每个字符分配到每一行。 观察到规律如下:
题目解答
class Solution {
public String convert(String s, int numRows) {
// 记录每行的字符
StringBuilder[] sbs = new StringBuilder[numRows];
// 初始化
for(int j = 0; j numRows; j ++) {
sbs[j] = new StringBuilder();
}
int i = 0;
while(i s.length()) {
// 从上至下,numRows个字符
for(int j = 0; j numRows && i s.length(); j ++) {
sbs[j].append(s.charAt(i ++));
}
// 左下角至右上角,numRows-2个字符
for(int j = numRows - 2; j 0 && i s.length(); j --) {
sbs[j].append(s.charAt(i ++));
}
}
// 整体连接起来
for(int j = 1; j numRows; j ++) {
sbs[0].append(sbs[j]);
}
return sbs[0].toString();
}
}
复杂度分析:
时间复杂度:
O(n)
,
n
为字符串长度
空间复杂度:
O(numRows)
参考资料
原文始发于微信公众号(xiaogan的技术博客):