006 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".

详见:https://leetcode.com/problems/zigzag-conversion/description/

解题思路:
1. 每一组 V 字形的长度为 size = 2 * line - 2 (斜向上的部分没有第一行和最后一样的元素),line 是行数
2. 对于垂直向下的一列元素来说,每一组向下的列之间间隔 size 大小,即一组元素的个数。
3. 对于斜向上的元素来说,它们的位置位于当前组 size - i(i 为该元素所在的行数,一组有 size 个字符,倒数第 i 个,位置为 size -i)。当前组的第一个字符所在位置为 j - i (j 为与斜向上的元素同在一行的,垂直向下的列的元素在字符串中的序号,i 为它们共同的行号)。
即:j-i就是zigzag的起始字符,然后我们是要倒数第i个,因为一个zigzag有size个字符,所以倒数第i个就是size-i,我们要赋值的字符就是(j-i)+(size-i)=j+size-2*i

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

 

posted on 2018-03-31 13:50  lina2014  阅读(132)  评论(0编辑  收藏  举报

导航