z字形转换_leetcode

来源:

https://leetcode-cn.com/problems/zigzag-conversion/

观察(numRows=3):

List item

  • Most importantly, 寻找idx, numRows, row的关系,这下你应该知道自己下次该如何解决这样的问题
  • row = idx % (2 * numRows - 2), 你会发现除数正好是z字形的一个小周期,如上图所示
  • row > numRows - 1 中,numRows 是从0开始,其中的row代表元素的下标,当其>=3 时开始适用 ===>例如T 是如何进入第二分队的
  • row = 2 * numRows - 2 - row 相当于一个周期减去row,就可以知道当前字符位于哪一个分队
  • len(result) < row + 1 以空字符串创建三大分队
  • 观察左下角的元素的row,借助于模运算,可以很快地将元素归队===>例如C,I,R 通过mod 4,一下子知道它们位于第一队
  • 很巧妙的是,处理中间一个元素一列的情况

实现:

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        result = list()
        for idx, ch in enumerate(s):
            row = 0
            if numRows != 1:
                row = idx % (2 * numRows - 2)
            if row > numRows - 1:
                row = 2 * numRows - 2 - row
            if len(result) < row + 1:
                result.append("")
            result[row] = result[row] + ch  # 根据行数定位元素
        return "".join(result)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值