首页 > 其他 > 详细

6.z字形变换

时间:2020-07-16 23:15:57      阅读:53      评论:0      收藏:0      [点我收藏+]

将一个给定字符串根据给定的行数,以从上往下、从左到右进行?Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING"?行数为 3 时,排列如下:

技术分享图片

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

方法一

分析:

斜线上的元素在原字符串中的下标为j+size-2*i。
    string convert(string s, int numRows) {
        //如果numRows=1,结果就是s
        if(numRows<=1) return s;
        string res;
        int size=2*numRows-2,n=s.size();
        //i表示行号,也是每行开头元素的下标
        for(int i=0;i<numRows;++i)
            //遍历每一行
            for(int j=i;j<n;j+=size){
                res+=s[j];
                if(i!=0&&i!=numRows-1&&j+size-2*i<n)
                    res+=s[j+size-2*i];
            }
       return res;
    }

方法二

分析:

也可以用下面这种更直接的方法来做,建立一个大小为 numRows 的字符串数组,为的就是把之字形的数组整个存进去,然后再把每一行的字符拼接起来,就是想要的结果了。顺序就是按列进行遍历,首先前 numRows 个字符就是按顺序存在每行的第一个位置,然后就是 ‘之’ 字形的连接位置了,可以发现其实都是在行数区间 [1, numRows-2] 内,只要按顺序去取字符就可以了,最后把每行都拼接起来即为所求。
   string convert(string s, int numRows) {
        if(numRows<=1) return s;
        string res;
        vector<string> v(numRows);
        int n=s.size(),i=0;
        while(i<n){
            //向下遍历numRows个字符
            for(int pos=0;pos<numRows&&i<n;pos++){
                v[pos]+=s[i++];
            }
            //斜向上遍历numRows-2个字符
            for(int pos=numRows-2;pos>0&&i<n;pos--){
                v[pos]+=s[i++];
            }
        }
        for(auto s:v) res+=s;
        return res;
    }

6.z字形变换

原文:https://www.cnblogs.com/Frank-Hong/p/13324954.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!