6. ZigZag Conversion 题解

6. ZigZag Conversion 题解



题目描述:


The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P   A   H   N
A P L S I I G
Y   I   R
And then read line by line:  "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)  should return  "PAHNAPLSIIGYIR" .




题目链接:6. ZigZag Conversion




算法描述:

          

          由题意知,给定一个字符串和行数,我们将对它进行 “zigzag” 方式的排序,排序完成后返回字符串。


       我们可以发现 “zigzag” 排序方式就是将字符串按照 “V” 字形排列。 接下来我们寻找遍历它的规律。


       我们用两个内嵌 for 循环,第一个 for 循环遍历其行,第二个 for 循环在每一行中对每个 “zigzag” 进行遍历(每个 “zigzag” 中要遍历两个字符)


        每一个 “V” 即 “zigzag” ,我们将其编为一组,一组的长度为:size =  2 * numRows - 2。


        每一个 “V” ,垂直向下的这一列中的元素与其它列对应的元素(行平行)之间间隔为一个 size。而斜向上的一列元素,在组中的位置为: size - i (i 为行数)。


        设当前组的第一个字符所在位置为j - i,即 j - i 为每一组的起始字符位置,我们还需要找到倒数第 i 个,即 (j - i)+ (size - i) = j + size - 2 * i。


        遍历时需要注意的是第一行和最后一行,遍历每组时只需要将头元素直接放入结果字符串即可。




代码:


class Solution {
public:
    string convert(string s, int numRows) {      
        if(numRows==1)
            return s;
        string str="";
        int size = 2 * numRows - 2;
        for(int i=0; i<numRows; i++){
            for(int j=i; j<s.size(); j+=size){
                str += s[j];
                if(i!=0 && i!=numRows-1 && j+size-2*i < s.length()){
                    str += s[j+size-2*i];
                }
            }
        }
        return str;
    }
};



         


       







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值