M6. Z 字形变换

题目链接

解析:

在这里插入图片描述
对于四行的实例,它的字符数分布是这样的:
在这里插入图片描述
解析参考了官方求解,从左向右遍历字符,将它放到对应的行中,只有在第一行或者最后一行,迭代的方向才会发生改变.

solution:

①将每个字符顺次放到对应的位置

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows == 1) return s;
        int col = 0;
        vector<string> vec(min(numRows,(int)s.size()));
        int flag = 0;
        for(char cc:s)
        {
            vec[col]+=cc;
            if(col == 0 || col == numRows-1) flag = !flag;//很巧妙地将方向变化
            col +=flag?1:-1;
        }
        string st;
        for(string str:vec) st+=str;//这里值得学习
        return st;
    }
};

②根据每个字符下标的规律,找到它对应的位置
第一行和最后一行每两个元素之间的间隔为step=2*(numRows-1);
其他行的元素之间间隔为step2i(行)和2*i交替

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows == 1) return s;
        int step = 2*(numRows-1);
        int n = s.size();
        vector<string> vec(numRows);
        for(int i = 0;i<numRows;i++)
        {
            int j=i;
            int add = 2*i;
             while(j<n)
             {
                 vec[i]+=s[j];
                 add = step-add;//这里很巧妙,间隔交替而且可以用一个循环判断
                 if(i==0||i==numRows-1)
                     j=j+step;
                 else
                     j = j+add;
             }
        }
        string str;
        for(string st:vec)
            str=str+st;
        return str;
    }
};片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值