目录
题目

解题思路
用ABCDEFGHIJKLMN来举例
当numRows = 3的时候
A E I M 0 4 8 12 step
B D F H J L N 1 3 5 7 9 11 13 step-2x1, step-(step-2x1)
C G K 2 6 10 step
间隔step = numRows + numRows - 2 = 3+3-2=4
当numRows = 4的时候
A G M 0 6 12 step
B F H L N 1 5 7 11 13 step-2x1,step-(step-2x1)
C E I K 2 4 8 10 step-2x2,step-(step-2x2)
D J 3 9 step
间隔step = numRows + numRows - 2 = 4+4-2=6
当numRows = 5的时候
A I 0 8 step
B H J 1 7 9 step-2x1,step-(step-2x1)
C G K 2 6 10 step-2x2,step-(step-2x2)
D F L N 3 5 11 13 step-2x3,step-(step-2x3)
E M 4 12 step
间隔step = numRows + numRows - 2 = 5+5-2=8
经过这三次距离可以得出,除了开头和结尾的两个,他们的步长为一个,中间的步长都为2两个进行循环,所以我们可以使用一个大小为2的数组,当然也可以用两个变量即可
然后我们通过举例也可以推断出他的变换是有迹可循的,我们发现第二行的就是在step步长的基础上减掉了2,然后他的第二个步长则是在step步长上减掉第一个步长,然后第三行是4,第四行是6,就可以得出是2*(行数-1)就是第一个步长的长度,第二个步长都是基于总步长的基础上减掉第一个步长
然后我们就可以编写代码了
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
char[] charArray = s.toCharArray();
int len = charArray.length;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numRows; i++) {
int step = numRows + numRows - 2;
if (i == 0 || i == numRows - 1) {
for (int j = i; j < len; j += step) {
sb.append(charArray[j]);
}
} else {
int[] arr = new int[2];
arr[0] = step - 2 * i;
arr[1] = step - arr[0];
for (int j = i, count = 0; ; count++) {
if (j < len)
sb.append(charArray[j]);
else
break;
if (count % 2 == 0) {
j += arr[0];
}
if (count % 2 == 1) {
j += arr[1];
}
}
}
}
return sb.toString();
}
}

相比官方的解法,速度和内存都是遥遥领先
如果对你有帮助的话不要忘记点个赞或者点个收藏可以以后再拿回来看看
357

被折叠的 条评论
为什么被折叠?



