算法30--ZigZag Conversion

本文介绍了一种将字符串以Z字形模式分布在多行上的算法,并提供了详细的实现思路及Python代码示例。通过理解算法背后的逻辑,可以掌握如何按行读取这种特殊布局的字符串。

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"

找规律即可,看一下大神的思路:

对于第i行,首先输出s[i],其次定义两个步长s1=2(n-1-i)  s2=2i ,s1,s2在i基础上交替相加,如果没有重复并且没有越界,则输出相应字符。

例如第3行,i==2  首先输出s[i]==3   然后s1=2(n-1-2)=2(n-3)  s2=2i=4  然后依次输出s[i+s1]  s[i+s1+s2]  s[i+s1+s2+s1]......每次输出时,都要判断s1,s2是否为零,为零说明上一个字符已经输出,其实由计算式可知,当i==0时,s2==0  当i==n-1时,s1==0,其余情况两者都均非零。在每一次输出字符时,都应判断该字符索引位置是否越界以及是否已经重复输出

临界条件判断:

当n==1时,直接返回s即可.

class Solution:
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        if numRows==1:
            return s
        result = ''
        for i in range(numRows):
            s1 = 2*(numRows-1-i)
            s2 = 2*i
            if i>=len(s):
                break
            result += s[i]
            pos = i
            while True:
                pos += s1
                if pos >=len(s):
                    break
                if s1>0:
                    result += s[pos]
                pos += s2
                if pos>=len(s):
                    break
                if s2>0:
                    result += s[pos]
        return result    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值