【Leetcode刷题】6.Z字形变换

菜鸡/咸鱼的自我修养之认真记录 

第一种解法:

缺点:用时较多

根据题目分析,Z字可拆分成一个类似V型的结构

示例:"L E E T C O D E I S H I R I N G" numRows=4

行数:"1 2 3 4 3 2 1 2 3 4 3 2 1 2 3 4"  (在Z字变换中对应的行数)

所以,我根据numRows构造index列表,将index与字符串序列一一对应 ,通过乘操作得到num_s

第一行:在前面 n 个元素 找出num_s 值为1 对应的下标;newStr存储s中对应下标的字符

其他行:可类比

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        n = len(s)
        if numRows==1:
            return s

        else:
            part = 2 * numRows - 2
            #至少需要m个Z字形
            m = (n // part) + 1

            index = [0] * part
            for i in range(part):
                if i < numRows - 1:
                    index[i] = i
                else:
                    index[i] = 2 * (numRows - 1) - i
            #虽然num_s的长度大于n 我们只取前n个
            num_s = index * m

            z = 0
            newStr = ['']*n
            for k in range(numRows):
                for j in range(n):
                    if num_s[j] == k:
                        newStr[z] = s[j]
                        z += 1
            
            #将列表转换为字符串
            s1 = ''.join(newStr)
            return s1

第二种解法:

CSDN 上看到的解法:

以“LEETCODERFUNORAM” 为例, 右侧的数字为字符在字符串序列里对应的下标

可以看出:

第一行和最后一行: 下标差均为(2*numRows-2)

中间行:E1 E7 R13下标差均为(2*numRows-2)  

               E1 和 O5 下标差为(2*numRows-2 - 2*行数)

L 0  D 6  O 12
E 1 O 5E 7 N 11R 13
E 2C 4 R 8U 10 A 14
T 3  F 9  M 15

 

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        n = len(s)
        if n==1 or n==0 or numRows==1:
            return s
        else:
            part = 2 * numRows - 2
            newStr = ""
            for i in range(numRows):
                for j in range(i, n, part): #j的取值从i开始,到字符串长度截止,步长为part
                    newStr += s[j]
                    #如果不是第一行或者最后一行,元素之间的关系
                    if i!=0 and i!=numRows-1 and part-2*i+j<n:
                        newStr += s[part-2*i+j]
            
            return newStr

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值