6. ZigZag Conversion

来源:互联网 发布:科目二模拟软件 编辑:程序博客网 时间:2024/06/05 03:09
问题:

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   NA P L S I I GY   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".

Subscribe to see which companies asked this question.

分析:zig-zag编码如下:


代码:

class Solution {
public:
    string convert(string s, int numRows) {
        int nsLen = s.length(),nFirst,nStrInd,nBlockLen;
        if (nsLen <= nRows || nRows == 1)//判断序列长度是否超过行数或者行数是否为1
        return s;
        nBlockLen = 2 * nRows - 2;//将整个序列分块,计算每块的长度
        nFirst = nBlockLen;//每行中第二个数据距离第一个数据的间隔
        int nsBlock = nsLen / nBlockLen + 1;//计算块数
        string sResult = "";
        for (int nTemp = 0; nTemp < nRows; nTemp++){
            sResult += s[nTemp];//将Z型中每行第一个符号添加到新建序列尾部
            for(int nIndex = 0; nIndex < nsBlock; nIndex++){
                nStrInd = nTemp + nBlockLen * nIndex + nFirst;
                if (nFirst != 0 && nStrInd < nsLen && nStrInd >= 0){
                    sResult += s[nStrInd];
                    }
                nStrInd = nTemp + nBlockLen * (nIndex + 1);
                if(nFirst != nBlockLen && nStrInd < nsLen){
                    sResult += s[nStrInd];
                }
            }
            nFirst = nFirst - 2;
        }
        return sResult;
    }
};

0 0
原创粉丝点击