Leetcode_06【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


脚本及注释:【耗时:56ms】

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        str1 = ""
        len1 = len(s)
        kk = 0
        if numRows == 1:
            return(s)
        n1 = (numRows - 1) * 2
        if numRows == 2:
            for i in range(0,len1,2):
                str1 += s[i]
            for j in range(1,len1,2):
                str1 += s[j]
            return(str1)
        else:
            for i in range(numRows):
                j = i
                while j+1 <= len1:
                    str1 += s[j]
                    j += 2*(numRows - i -1)
                    #if j+1 <= len1:
                    #    str1 += s[j]
                    bb = n1 - 2*(numRows - i -1)
                    if bb == 0:
                        if j+1 <= len1:
                            str1 += s[j]
                            j += 2*(numRows - i -1)
                    elif bb == n1:
                        j += n1
                    else:
                        #print(bb,j)
                        if j+1 <= len1:
                            str1 += s[j]
                            j += bb
        return(str1)

脚本逻辑:

  1. 此题属于查找规律类,通过行数可知存在以下规律:
    1. 第一行第一个和第二个之间隔着行数(numRows-2)* 2 +1(设为m个)字符;第二行第一个、第二个和第三个存在如下规则:第一个为给定字符串s的第二个;第二行第二个与第二行第一个隔着 m - 2个字符;第二行第二个位置和第二行第三个位置隔着m - (m-2)=2个字符 
  2. 除首尾两行外,中间行的字符间隔存在着上面的规律
  3. 理解此规律后,再细读脚本即可
原文地址:https://www.cnblogs.com/mailong/p/12227357.html