LeetCode-算法编程——6.N字形变换

原题目:

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

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

P   A   H   N
A P L S I I G
Y   I   R

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

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

string convert(string s, int numRows);

提示:

  • 1 <= s.length <= 1000
  • s 由英文字母(小写和大写)、',' 和 '.' 组成
  • 1 <= numRows <= 1000

示例 1:

输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"

示例 2:

输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

输入:s = "A", numRows = 1
输出:"A"

分析:

  1. 若numRows为4,即将原始字符串按照1234321234...按照此编码顺序依次将1、2、3、4的值对应的字符重新排列,循环原始字符长度,存储每个字符的位置编码,然后依次取出字符即可,对应代码版本1
  2. 按照题目所示,每个字母的位置存在对应的规律(做的时候算出来的,写博客时突然忘记怎么算啦,代码先贴上,后面补思路和注释)

代码:

Python3版本

"""
#版本1
计算并存储每个字符位置的编码,依次读取
"""
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        s_len = len(s)
        if s_len <= numRows or numRows == 1:
            return s
        ans = ""
        res = [0] * s_len
        index = 1
        flag = True
        for i in range(s_len):
            res[i] = index
            if flag:
                index = index + 1
            else:
                index = index - 1
            if index == numRows+1:
                index = index - 2
                flag = False
            elif index == 0:
                index = index + 2
                flag = True
        for i in range(1, numRows+1):
            for j in range(s_len):
                if res[j] == i: 
                    ans = ans + s[j]
        print(res)
        return ans

"""
版本2
字符位置存在规律
"""
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        s_len = len(s)
        if s_len <= numRows or numRows == 1:
            return s
        ans = ""
        for i in range(numRows):
            temp = i
            index = 0
            while -1 < temp < s_len:
                ans = ans + s[temp]
                if 1 <= i < numRows - 1 and temp + ((2 * numRows) - 2) - 2 * i < s_len:
                    ans = ans + s[temp + ((2 * numRows)- 2 ) - 2 * i]
                index = index + 1
                temp = i + ((2 * numRows) - 2) * index
        return ans

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值