[力扣][精选]第6题-Z字形变换

[力扣][精选]第6题-Z字形变换

答案:

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows==1:#单行的情况单独判断,提高运行速度
            return s
        i, ele, mid, ans = 0, [], [], []
        while i < len(s):#切分字符串,将N字形的列字符与中间字符分开储存
            ele.append(s[i:i + numRows])  # 存储列字符,到达字符串末尾自动停止
            #存储中间字符并调换顺序(将后一个字符调转到前面)
            mid.append((s[i + numRows:i + 2 * numRows - 2])[::-1])#添加至中间字符串数组
            i = i + 2 * numRows - 2 #索引到下一列(如4行则加6至下一列,跳转同时跳过中间元素直接指向下一列的第一个元素)
        for i in range(numRows):
            if 0 < i < numRows - 1:  # 判断是否为中间元素
                for o in range(len(ele)):
                    try:#简单的异常处理,跳过索引出错(通常是因为数组内字符串的字符不够了,这种情况直接跳到下一行执行就可以)
                        ans.append(ele[o][i])
                        if len(mid[o]) < numRows - 2:
                            mid[o] = " " + mid[o]#防止中间元素的顺序被错误调换,在字符前加入空格作为无效符号
                        ans.append(mid[o][i - 1])#添加中间元素
                    except IndexError:
                        continue
            else:
                for j in ele:#添加列元素
                    if len(j) > i:#只有当列元素的长度满足要求时才会添加
                        ans.append(j[i])  
        return "".join(ans).replace(" ", '')
        

本题的思路包括两个步骤:切分字符串+重塑字符串
本题的核心要点:

  1. 切分字符串时,列元素的顺序无需调换,而中间元素的顺序需要调换。在使用中间元素字符串时,如果中间元素字符串的长度少于中间元素字符串,则在该字符串前加入空格符号,以将出错的顺序调换回来
  2. 异常处理的使用。在重塑字符串时,如果索引超出界限,那么一般是字符串的长度不足导致的,此时不需要特殊操作,判断异常后直接继续执行即可
  3. 切分字符串的索引需要适当的计算经验。以切分为4行为例,将字符串以6个字符分组,同个组内的前4个字符为列元素,后两个为中间元素,分别存放至数组

本题的答案虽然写的比较糟糕,但也算是完成了任务,速度与内存消耗皆不算高。实际上题目本身不难,不需要高超的技巧,就是费时比较多。

1157 / 1157 个通过测试用例
状态:通过
执行用时: 48 ms
内存消耗: 15.2 MB

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值