LeetCode 6.Z 字形变换(简单模拟和按列访问,C++和python)

6. Z 字形变换

题目链接
在这里插入图片描述
在这里插入图片描述
这道题直接简单模拟,先放进一个二维数组然后按行访问数组即可。
官方题解:用的按行排序和按行访问
由于官方没有python版本,我这里给出官方题解的python版本在最后
 
简单模拟方法:

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows == 1) return s;
        vector<vector<char>> v(numRows);
        int j = 0, i = 0;
        int flag = 1;//flag控制方向
        while(i < s.size())
        {
             v[j].push_back(s[i]);
             i++;
            if(j >= numRows-1)//到达边界改变方向
                flag = 0;
            if(j <= 0) flag = 1;
            if(flag == 1)
                j++;//向下则加
            else j--; //向上则减   
            
        }
        string ans = "";
        for(int i = 0; i < numRows; i++)
        {
            for(int j = 0; j < v[i].size(); j++)
            {
                ans += v[i][j];//按行访问二维数组
            }
        }
        return ans;       
    }
};

在这里插入图片描述

python3按行排序:

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows == 1:
            return s
        list1 = ['']*numRows
        curRow = 0
        goingDown = False
        for c in s:
            list1[curRow] += c
            if curRow == 0 or curRow == numRows-1:
                goingDown = not goingDown
            curRow += 1 if goingDown else -1
        ans = ''
        for row in list1:
            ans += row
        return ans

在这里插入图片描述
python3按行访问:

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows == 1:
            return s
        ret = ''
        n = len(s)
        cycleLen = 2*numRows - 2
        for i in range(0, numRows):
            for j in range(0, n-i, cycleLen):
                ret += s[j+i]
                if i != 0 and i != numRows - 1 and j + cycleLen - i < n:
                    ret += s[j + cycleLen - i]
        return ret


在这里插入图片描述

如果对你有帮助的话,请点个赞哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值