2022.1.9 每日一练 Z 字形变换

如有错误请指出!谢谢

https://dailycode.youkuaiyun.com/practice/2190921

答案选A

class Solution {
    public String convert(String s, int numRows) {
        if (numRows == 1)//当行数为1时或者当字符串长度不超过行数时,将字符串直接输出
            return s;
        int len = s.length();
        if (len <= numRows)
            return s;
        int cycle_len = 2 * numRows - 2;
        int full_cycles = len / cycle_len;
        int left = len % cycle_len;
        StringBuilder r = new StringBuilder();
        int i;
        for (i = 0; i < full_cycles; ++i) {//对z字形的第一行进行填充
            r.append(s.charAt(i * cycle_len));
        }
        if (left > 0) {
            r.append(s.charAt(i * cycle_len));
        }
        for (i = 0; i < numRows - 2; ++i) {
            int j;
            for (j = 0; j < full_cycles; ++j) {//对z字形中间的矩阵进行填充
                r.append(s.charAt(j * cycle_len + i + 1));
                r.append(s.charAt(j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)));
            }
            if (left > 0) {
                if (j * cycle_len + i + 1 < len)
                    r.append(s.charAt(j * cycle_len + i + 1));
                if (j * cycle_len + i + 1 + cycle_len - 2 * (i + 1) < len)
                    r.append(s.charAt(j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)));
            }
        }
        for (i = 0; i < full_cycles; ++i)//对z字形的最后一行进行填充
            r.append(s.charAt(i * cycle_len + numRows - 1));
        if (left >= numRows)
            r.append(s.charAt(i * cycle_len + numRows - 1));
        return r.toString();
    }
}

答案程序中使用了StringBuilder,可以通过下面的链接快速了解其使用方法

https://www.liaoxuefeng.com/wiki/1252599548343744/1260471862687712

设定了四个参数 

1、cycle_len表示字符串z字循环数(每z字排列一次算作循环一次)

2、full_cycles表示满循环次数,即排列完整个z字形数

3、left表示排列完整z字形循环余下的字符数量,

4、r表示新的字符串

示例图:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软糖工程001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值