[LeetCode] ZigZag Conversion

题意

给一个字符串,把它按照反 N 形(也就是 N 的左右镜像的形状,先竖后右上)重新排列,然后按行输出。

题解

第一反应:暴力可解。

第二反应:既然暴力可解,那么有没有什么快速方法?直接从字符串里面做 text[i,len(text),step],拼接到 ans 里面。

然后,step 怎么求…… 而且一行中 step 也是在变化的。

遂放弃。

代码

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        if numRows == 1:
            return s

        t = [''] * numRows
        numRows -= 1
        now_row = 0
        s_len = len(s)
        dir = -1
        for i in range(s_len):
            t[now_row] += s[i]
            if now_row in [0, numRows]:
                dir *= -1
            now_row += dir
        return ''.join(t)

结果

1158 / 1158 test cases passed.
Status: Accepted
Runtime: 116 ms

桩程序

if __name__ == '__main__':
    cases = [
        {'text': 'PAYPALISHIRING', 'nRows': 1, 'ans': 'PAYPALISHIRING'},
        {'text': 'PAYPALISHIRING', 'nRows': 2, 'ans': 'PYAIHRNAPLSIIG'},
        {'text': 'PAYPALISHIRING', 'nRows': 3, 'ans': 'PAHNAPLSIIGYIR'},
        {'text': 'PAYPALISHIRING', 'nRows': 4, 'ans': 'PINALSIGYAHRPI'},

    ]

    for item in cases:
        ans = (Solution()).convert(s=item['text'], numRows=item['nRows'])
        print(str(ans == item['ans']) + "\t=>" + str(ans) + ":" + str(item['ans']))

留下评论