Python实现字符串的Z 字形变换

Leetcode刷题笔记 专栏收录该内容
26 篇文章 1 订阅

题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
LeetCode原题地址:https://leetcode-cn.com/problems/zigzag-conversion/

测试用例

比如输入字符串为"LEETCODEISHIRING" 行数为 3 时,排列如下:

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

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

“LCIRETOESIIGEDHN”。

请你实现这个将字符串进行指定行数变换的函数:

  • 示例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

代码实现

  • 按行排序
class Solution(object):
    def convert(self,s,numRows):
        if numRows < 2:
            return s
        #用来存放Z字变换的字符串
        list_rows = ["" for _ in range(min(len(s),numRows))]
        #用来记录方向
        is_down = False
        #用来记录当前字符更新的行
        current_row = 0
        for s_c in s:
            #更新存放变换后的列表
            list_rows[current_row] += s_c
            if current_row == 0:
                is_down = True
            elif current_row == numRows - 1:
                is_down = False
            #计算下一次更新变换列表的位置
            current_row += 1 if is_down else -1
        #返回最后变换后的字符串
        return "".join(list_rows)
  • 归纳统计
class Solution(object):
    """
    L     D     R
    E   O E   I I
    E C   I H   N
    T     S     G
    归纳总结,统计出变换后的每行字符串在原字符串的位置
    其中k代表的是某一行的字符个数,rows代表总的行数
    原字符串满足第一行的公式:k(rows-1)*2
    原字符串满足中间行的公式:k(rows-1)*2 + i和(k+1)(rows-1)*2 - i
    原字符串满足最后一行的公式:k(rows-1)*2 + rows - 1

    注:其实第一行和最后一行的公式都可以统一为,k(rows-1)*2 + i
    """
    def convert(self,s,numRows):
        if numRows < 2:
            return s
        s_size = len(s)
        #每个循环的长度
        cycle_len = (numRows - 1) * 2
        #用来记录拼接后的字符串
        ret = ""
        #遍历每行
        for i in range(numRows):
            for j in range(0,s_size-i,cycle_len):
                ret += s[j+i]
                #如果是中间行的时候,会多一种情况
                if i != 0 and i != numRows - 1 and j + cycle_len - i < s_size:
                    ret += s[j + cycle_len - i]
        return ret

参考:

  1. LeetCode详细题解
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

修炼之路

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值