leetcode 6. Z 字形变换

6. Z 字形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

01234567
LCIR
ETOESIIG
EDHN

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。

[1]常规法就是设置标志位;判断当前数组的游标出于什么位置,进而进行对应的移动.
可以理解为开个数组,把输入按要求放进去,然后再按输出顺序读出来

"""
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。


```python
"""
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN""""
class Solution(object):
    def convert(self, s, n):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        #麻瓜解法:开个数组,把输入按要求放进去,然后再按输出顺序读出来
        if n <= 1:
            return s
        l = len(s)
        #创建一个二维的列表[0]*5 for _ in range(3)即
        #创建一个3*5的0列表
        #1. 从上往下压, 定义state = "down",
        #每次x += 1,当x触底就转换state为"up"
        #2. 从左下往右上压, 定义state = "up",
        #每次 x -= 1, y += 1, 当x归零就转换state为"down"
        record = [[0] * l for _ in range(n)]
        x, y = 0, 0
        state = "down"
        #for (index,char) in enumerate(S)同时使用下标和元素进行循环
        for i, char in enumerate(s):
            # print x, y, char
            record[x][y] = char
            if state == "down":
                if x != n - 1:
                    x += 1
                else:
                    state = "up"
                    x -= 1
                    y += 1
                continue
            
            elif state == "up":
                if x != 0:
                    x -= 1
                    y += 1
                else:
                    state = "down"
                    x += 1
        # print record
        res = ""
        for row in record:
            for char in row:
                if char != 0:
                    res += char
        
        return res

第二种借鉴的leetcode上面大佬的解法,是使用字符串的形式,每行都拆分为一个字符列表,如下图res[0~3],最后再将上述的所有字符列表合并输出.
每行拆分为一个列表

class Solution(object):
    def convert(self, s:str, n:int)-> str:
        if n < 2: return s
        res =  ['']*n
        i, flag = 0, -1
        for c in s:
            res[i] += c#顺序把字符加入每个列表中
            #每次处于列的首尾就进行翻转
            if i == 0 or i == n-1:  flag = -flag
            i += flag
        return "".join(res)

if __name__ == "__main__":
    s = Solution()
    out = s.convert("leetcode", 3)
    print(out)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值