力扣-N字变换

题目:给出N字字符串,要求我们按行输出每一个字符。

链接:6.N字型变换

根据N字上下循环的特点,可以联想到周期函数。

通过观察可以看出,周期为2 * (numRows - 1),但是我们要输出的是同行的字母,除了第一行和最后一行都不满足这个条件。

根据题面,走一遍N字,你能感觉得到,我们所要求的同行字母,其实就是从这走到下边,再走回来,从这走到上边,再走回来,看到这估计你就会有想法了。

没错,就是往下走有一个周期,往上走又是一个周期,我们只需要变换周期来找到同行字符即可

假设当前行号为 idx{ idx|1 ~ numsRows },那么到达下界所走的步数为(n - idx ),从下界走到当前行号也为(n-idx),那么往下走再回来就是2 * (n - idx),同理,走到上界走再走回来为2 * (idx - 1)

代码如下:

开关设一个就可以,码力不足写臭了

 

class Solution {

    public String convert(String s, int numRows) {

        if(numRows == 1){ // 只有一行,直接返回就行了

            return s;

        }

        boolean upflag = false;

        boolean downflag = true;

        int n = numRows;

        String ans = "";

        int loop = 0; // 当前下标的循环周期

        for(int i = 0;i < n;i++){

            int idx = i; 

            upflag = false;

            downflag = true;

            if(i == 0||i == n-1){

                while(idx < s.length()){

                    ans += s.charAt(idx);

                    idx += 2*n-2;

                }

            }

            else{

                while(idx < s.length()){

                    if(downflag){

                        ans += s.charAt(idx);

                        loop = 2 * (n - (i + 1));

                        idx = idx + loop;

                        downflag = false;

                        upflag = true;

                    }else if(upflag){

                        ans += s.charAt(idx);

                        loop = 2 * ((i+1) - 1);

                        idx = idx + loop;

                        upflag = false;

                        downflag = true;

                    }

                }

            }

        }

        return ans;

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值