菜鸟刷力扣 5

Z 字形变换

在这里插入图片描述思路:刚刚开始是没有思路,被中间表现的空格给误导了。冷静分析:(下标–行数)
例如 行数为3:
0-0 ,1-1 ,2-2 ,3-1;
4-0 ,5-1 ,6-2 ,7-1;
行数为4:
0-0 ,1-1 ,2-2, 3-3 ,4-2, 5-1,6-0
根据分析,循环的一组数量为 2行数-2
根据取余求当前字符所在的行数,当余数大于行数时,满足 应在行数=循环一组数-余数
比如 行数为:3 (0,1,2) 一组循环为:2
3-2=4;
下标为1所在行= 1%41 (1-1)
下标为3所在行= 3%4
3,判断3大于行数?(最大行数为2,因为从0开始),所以 所在行=循环-余数=4-3=1 (3-1)
同理4行如此!

最后循环拼接字符!
代码如下

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows==1)
        {
            return s;
        }
        int max=1000;
        if(max>numRows)
        {
            max=numRows;
        }
        string shuzu[max];
        int xunhuan=  2*numRows-2;
        int hang=0;

    for(int i=0;i<s.size();++i)
    {
        hang=i%xunhuan;
       if (hang>numRows-1)
       {
           hang=xunhuan - hang;
       }
       shuzu[hang]+=s[i];
}
 string temp{};
 for(int i=0;i<max;++i)
 {
     temp+=shuzu[i];
 }
       return temp;
    }
};

大佬思路:只需要判断当前存的位置是不是开头或者结尾!!(开头)0.,(结尾)行数-1;
bool 方向=1
int hang=0
如果是开头,将方向等于1,每次填的位置为[hang+方向];
如果是结尾,将方向等于-1,每次填的位置为[hang+方向];
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值