• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
卿与
博客园    首页    新随笔    联系   管理    订阅  订阅
6.Z 字形变换

6.Z 字形变换

题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);

示例 1:
  • 输入: s = "LEETCODEISHIRING", numRows = 3
  • 输出: "LCIRETOESIIGEDHN"
示例 2:
  • 输入: s = "LEETCODEISHIRING", numRows = 4
  • 输出: "LDREOEIIECIHNTSG"
  • 解释:
L     D     R
E   O E   I I
E C   I H   N
T     S     G

题解

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
    我是根据Z行走动找出规律。根据索引判断他们在哪一行。
    在这里插入图片描述
    如上图,循环节 cyc = numRows*2-2 在进行一定取余之后他们会有一定的规律。这个很容易发现。可以按照自己的思路来编程。
    但是要注意特殊情况。当行数是1的时候需要单独讨论。
python代码
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        res = ['']*numRows
        cyc = numRows*2-2
        n = len(s)
        if numRows == 1: return s
        for i in range(n):
            index = i%cyc
            if index < numRows:
                res[index] += s[i]
            else:
                temp = numRows-2-index%numRows
                res[temp] += s[i]
        ans = ''
        for i in res:
            ans += i
        return ans
完整python代码
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        res = ['']*numRows
        cyc = numRows*2-2
        n = len(s)
        if numRows == 1: return s
        for i in range(n):
            index = i%cyc
            if index < numRows:
                res[index] += s[i]
            else:
                temp = numRows-2-index%numRows
                res[temp] += s[i]
        ans = ''
        for i in res:
            ans += i
        return ans

def stringToString(input):
    return input[1:-1].decode('string_escape')

def main():
    import sys
    import io
    def readlines():
        for line in io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8'):
            yield line.strip('\n')

    lines = readlines()
    while True:
        try:
            line = next(lines)
            s = stringToString(line);
            line = next(lines)
            numRows = int(line);
            
            ret = Solution().convert(s, numRows)

            out = (ret);
            print(out)
        except StopIteration:
            break

if __name__ == '__main__':
    main()
posted on 2020-02-21 11:34  卿与  阅读(66)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3