提示:
1 <= s.length <= 1000
s 由英文字母(小写和大写)、',' 和 '.' 组成
1 <= numRows <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路及方法
方法一
存在规律,对于n行的, s中的第i个字符,对余数进行判断:
i%(2n-2) == 0,为第0行;
i%(2n-2) == 1 || 2n-2-1,为第1行;
i%(2n-2) == 2 || 2n-2-2,为第2行;
...
i%(2n-2) == n-1,为第n-1行;
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) return s;
List<StringBuilder> rows = new ArrayList<>();
// 按行存入
for (int i = 0; i < numRows; i++) {
StringBuilder row = new StringBuilder();
int k = 2 * numRows - 2;
// 遍历字符串
for (int j = 0; j < s.length(); j++) {
if (j % k == i || j % k == k - i) {
row.append(s.charAt(j));
}
}
rows.add(row);
}
String res = "";
for (StringBuilder sb : rows) {
res = res + sb.toString();
}
return res;
}
}
结果如下:
方法二
可以使用按行填充的方法,将复杂度降到O(n)。
step代表步数,当遇到第一行和最后一行就逆着步子填充。
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) return s;
List<StringBuilder> rows = new ArrayList<>();
// 构建行
for (int i = 0; i < numRows; i++) {
rows.add(new StringBuilder());
}
// 按行存储
int row = 0, step = -1;
for (char ch : s.toCharArray()) {
// 第一行和最后一行逆序
if (row == 0 || row == numRows - 1) step = -step;
// 填充
rows.get(row).append(ch);
row += step;
}
// 构建字符串
StringBuilder res = new StringBuilder();
for (StringBuilder sb : rows) {
res.append(sb);
}
return res.toString();
}
}
结果如下:
网友评论