LeetCode 6 Z字形变换(字符串)

16 篇文章 0 订阅

题目要求:

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

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

之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

实现一个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"

示例 2:

输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:

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

 

 

C++代码:

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows <= 1)
        return s;

        const int len = (int)s.length();
        string *str = new string[numRows];

        int row = 0, step = 1;
        for (int i = 0; i < len; ++i)
        {
            str[row].push_back(s[i]);

            if (row == 0)
                step = 1;
            else if (row == numRows - 1)
                step = -1;

            row += step;
        }

        s.clear();
        for (int j = 0; j < numRows; ++j)
        {
            s.append(str[j]);
        }

        delete[] str;
        return s;
        }
};

 

 

 

 

结果:

 

 

 

解析:

代码读起来也是比较清晰的。

首先如果numRows≤1的话,就直接返回原来的字符串s

如果大于1,我们重新定义一个str字符串,用来装重新排好序的字符。

这个str一共有numRows行,我们通过一个for循环来对原字符串s中的每个元素逐一遍历操作,因此时间复杂度是O(n)级别的。

row也就是numRows行,假设一共需要分4行,那么row=0、1、2、3;

一开始往下填充字符时,step=1,也就是正向(我们把向下当正向,向上的时候当反向)

所以row从0->3时,step=1,然后就从原字符串s中依次取出当前的字符,放入str中,

当row遍历到3(numRows-1)时,这时候改step=-1,因为已经到最底了,我们要逐一从下往上遍历,具体操作跟之前一样;

然后row从3->0时,step=-1;

当row又重新回到0(row == 0)时,step又变回1,因为已经到最顶了,接下来又要重复之前的步骤,从上到下遍历,存当前元素进str。

当对字符串s中的所有字符逐一遍历完成后,就会按照从上到下的顺序排序好,这时候只需要按顺序,从str里按行读取每一行的所有字符,就可以得到最终排序的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值