LeetCode - Z 字型变换
废话不说,LeetCode地址奉上.
https://leetcode-cn.com/problems/zigzag-conversion/ 中文版不需要翻墙哈!
这种题型问题不大而且难度也不大,关键在于问题的理解。出题的频率也不高。
接下来是题目描述:
题目给的比较清楚,但是不太容易理解。这里的关键问题是什么呢,如果我们把每一行都表达出来,然后把所有行合并成一行就成功了。那么现在问题的关键是怎么分割成多行呢?
看示例2的第一行,L和D之间是有空格的,但是这是为了让你看到Z而不是真实存在的,因为输出结果中没有空格。那么问题就比较清楚了,简单来说就是先从字符串中取字符让如到第一行,然后一直放到和行数相等,然后着从倒数第二行开始放一直放到第一行,直到字符取完。就行了!然后是代码:
StringBuilder[] stringBuilders = new StringBuilder[numRows];
int i = 0;
//初始化每一行,每一行用StringBuilder表示
for (int j = 0; j < stringBuilders.length; j++) {
stringBuilders[j] = new StringBuilder();
}
//字符取完就结束
while (i < s.length()) {
//从第一行开始放放字符,idx表示行数因为数组下标从0开始所以idx < numRows
for (int idx = 0; idx < numRows && i < s.length(); i++) {
stringBuilders[idx++].append(s.charAt(i));
}
//从倒数第二行开始,对应下标是 numRows-2 idx>=是为了不和idx = 0 重复
for (int idx = numRows - 2; idx >= 1 & i < s.length(); i++) {
stringBuilders[idx--].append(s.charAt(i));
}
}
//合并成一行
for (int j = 1; j < stringBuilders.length; j++) {
stringBuilders[0].append(stringBuilders[j]);
}
//返回结果
return stringBuilders[0].toString();
如果哪位小伙伴发现不能ac,麻烦评论谢谢,有想法也可以在评论区交流!