前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode 6 ZigZag Conversion

leetcode 6 ZigZag Conversion

作者头像
流川疯
发布2019-01-18 15:29:49
4120
发布2019-01-18 15:29:49
举报
文章被收录于专栏:流川疯编写程序的艺术

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”.

解决方案: The idea is, the first row and last row has no offset. Each element has a fixed difference of 2(nRows-1); For the rows in between, there is a incremental offset of 2;

0 6 12 -> distance = 2(nRows-1) = 6 offset = 0 1 5 7 11 -> offset = distance - 2 = 4 2 4 8 10 -> offset = distance -2 -2 = 2 3 9 -> distance = 2(nRows-1) = 6 offset = 0

Easy to observe. There is a catch, that you need to add the offset element with previous regular element. 5 follows 1, 4 follows 2. Otherwise, you will miss the tail if there is no vertical column in the end.Looks like a CS homework:)

代码语言:javascript
复制
class Solution {
public:
    string convert(string s, int nRows) {
        if(s.length() == 0 || 
            s.length()/nRows < 1 ||
            nRows == 1) 
        {
            return s;
        }
        int distance = 2*(nRows-1);
        string result;
        int offset = 0;
        for (int row = 0; row < nRows; row++)
        {
            for (int index = row; index < s.length(); index += distance)
            {
                result+=s[index];
                if (offset != 0 && index + distance - offset < s.length())
                {
                    result+=s[index + distance - offset];
                }
            }
            offset += 2;
            offset = offset % distance;
        }
        return result;
    }
};

解决方案2:

这里写图片描述
这里写图片描述

The problem statement itself is unclear for many. Especially for 2-row case. “ABCD”, 2 –> “ACBD”. The confusion most likely is from the character placement. I would like to extend it a little bit to make ZigZag easy understood.

The example can be written as follow: 1.P…….A……..H…….N 2…A..P….L..S….I…I….G 3…..Y………I……..R

Therefore,

代码语言:javascript
复制
class Solution {
public:
    string convert(string s, int numRows)
    {


    if (numRows <= 1)
        return s;

    const int len = (int)s.length();
    string *str = new string[numRows];

    int row = 0, step = 1;
    for (int i = 0; i < len; ++i)
    {
        str[row].push_back(s[i]);

        if (row == 0)
            step = 1;
        else if (row == numRows - 1)
            step = -1;

        row += step;
    }

    s.clear();
    for (int j = 0; j < numRows; ++j)
    {
        s.append(str[j]);
    }

    delete[] str;
    return s;
}
};

python解决方案: The idea is to use the remainder (index%period) to determine which line the character at the given index will be. The period is calculated first based on nRows. A dictionary with remainder:line as key:value is then created (this can also be done with a list or a tuple). Once these are done, we simply go through s, assign each character to its new line, and then combine these lines to get the converted string.

The code may be further shortened by using dict comprehension:

d={i:i if i

代码语言:javascript
复制
def convert(self, s, nRows):
    if nRows==1:
        return s
    period= 2*(nRows -1)
    lines=["" for i in range(nRows)]
    d={} # dict remainder:line
    for i in xrange(period):
        if i<nRows:
            d[i]=i
        else:
            d[i]=period-i

    for i in xrange(len(s)):
        lines[ d[i%period] ] +=s[i]

    return "".join(lines)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年05月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档