Leetcode刷题笔记题解(C++):6. Z 字形变换

思路:根据每个字符的下标来确定它在哪一行,然后生产新的字符串即可

代码如下:

class Solution {
public:
    string convert(string s, int numRows) {
        int size=s.length();
        //行数取定义行数,如果字符串的长度小于行数的话则取字符串长度
        numRows=min(numRows,size);
        //如果字符串的长度为1或者行数为1时,直接输出原字符串
        if(numRows==1||size==1) return s;
        //m保存Z字重复一块有多少个字符,比如3行的话就有6个字符
        int m=numRows*2-2;
        //用来保存每行的字符
        vector<vector<char>>res(numRows);
        for(int i=0;i<size;i++){
            //根据i来确定s[i]在哪一行,用numRows=3来举例,
            //m=6
            //i=4,j=4,s[i]就在res[2]中
            int j=i%m;
            if(j>=numRows){j=m-j;}
            res[j].push_back(s[i]);
        }
        //输出字符串
        string out;
        for(int i=0;i<numRows;i++){
            for(int j=0;j<res[i].size();j++){
                out+=res[i][j];
            }
        }
        return out;

    }
};

思路二:按照思路走,

利用变量flag来指定往上走还是往下走

flag=1的意思往下走,当走到第一行的时候需要往下走

flag=-1的意思往上走,当走到最后一行的时候需要往上走

代码如下:

class Solution {
public:
    string convert(string s, int numRows) {
        int size=s.length();
        //行数取定义行数,如果字符串的长度小于行数的话则取字符串长度
        numRows=min(numRows,size);
        //如果字符串的长度为1或者行数为1时,直接输出原字符串
        if(numRows==1||size==1) return s;
        //用来保存每行的字符串
        vector<string>res(numRows);
        //i来标记下标,flag来标记往下走还是往上走,初始为-1是从下往上改为从上往下走
        int i=0,flag=-1;
        for(char c:s){
            res[i]+=c;
            //当走到第一行或者最后一行需要进行变向
            if(i==0||i==numRows-1) flag=-flag;
            //每次走一步
            i+=flag;
        }
        //输出字符串
        string out;
        for(int i=0;i<numRows;i++){
            out+=res[i];
        }
        return out;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Demo.demo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值