LeetCode-6. ZigZag Conversion

6. ZigZag Conversion

Medium

10683338FavoriteShare

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

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

And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string s, int numRows);

Example 1:

Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

Example 2:

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:

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

我一开始想的是顺着它的逻辑走,填充矩阵,发现不好做,看了大佬的题解,用的是下标法,真的是数学大法好

下面题解来源于:https://www.cnblogs.com/TenosDoIt/p/3738693.html


题目的意思是把字符串上下上下走之字形状,然后按行输出,比如包含数字0~22的字符串, 给定行数为5,走之字形如下:

image

现在要按行输出字符,即:0 8 16 1 7 9 15 17 2…….

如果把以上的数字字符看做是字符在原数组的下标, 给定行数为n = 5, 可以发现以下规律:

(1)第一行和最后一行下标间隔都是interval = n*2-2 = 8 ;                                                  

(2)中间行的间隔是周期性的,第i行的间隔是: interval–2*i,  2*i,  interval–2*i, 2*i, interval–2*i, 2*i, …

 

然后我作为码农敲了一下对应这个逻辑的python代码

 

solution:

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        i = 0
        ans = ""
        if s == "":
            return ""

        if numRows == 1:#排只有一行的情况
            return s

        internal = 2 * numRows - 2
        strlen = len(s)
        while i < strlen: #处理第一行
            ans += s[i]
            i+=internal

        for i in range(1,numRows-1): #处理中间的行
            if i < strlen: #因为存在numRow大于字符串长度的情况,所以这里需要有一个判断,判断i是否小于字符长度
                ans += s[i]
                inter = i<<1
                j = i
                while j < strlen:
                    inter = internal - inter
                    j += inter
                    if j < strlen:
                        ans += s[j]

        i = numRows -1
        while i < strlen:  # 处理第一行
            ans += s[i]
            i += internal

        return ans

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值