Leetcode 6、Z字形变换
思路:找规律,可以手动模拟
- 对于第一行和最后一行来说,每次变化的幅度都是确定的
- 第一行是下面的剩余行数 * 2,
- 最后一行是上面的行数 * 2,
- 对于中间的行数来说,幅度是不确定的,第一次是下面剩余行数 * 2,第二次是上面的行数 * 2,并一直交替变化。
- 同时需要注意的地方是,可能numRows = 1,那么变化的幅度是0,会陷入死循环,所以每次变化的幅度,在计算出来的结果和 1之间取最大值。
时间复杂度:O(n)
- 每个字符被访问一次
空间复杂度:O(n)
- 使用StringBuffer存储最后的结果
class Solution {
public String convert(String s, int numRows) {
StringBuffer sb = new StringBuffer();
int len = s.length();
for(int i = 0; i < numRows; i++) {
int index = i;
boolean flag = true;
while(index < len) {
sb.append(s.charAt(index));
if(i == 0) {
index += Math.max(1, ((numRows - 1 - i) * 2));
}else if(i == numRows - 1) {
index += Math.max(1, 2 * i);
}else {
if(flag) {
index += Math.max(1, ((numRows - 1 - i) * 2));
flag = false;
}else {
index += Math.max(1, 2 * i);
flag = true;
}
}
}
}
return sb.toString();
}
}