力扣第六题 6.Z字形变换

目录

题目

解题思路


题目

解题思路

用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();
    }
}

相比官方的解法,速度和内存都是遥遥领先

如果对你有帮助的话不要忘记点个赞或者点个收藏可以以后再拿回来看看

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值