leetcode_p6_ZigZag_Conversion_c++

本文介绍了LeetCode的第6题——Z字形变换,给出了解题思路和C++代码实现。题目要求根据给定的行数numRows,将字符串s以Z字形排列并返回变换后的字符串。通过分析示例,发现了与行数相关的规律,即步长与行数的关系,并据此编写了代码。
摘要由CSDN通过智能技术生成

leetcode p6: ZigZag_Conversion

给定一个字符串s和行数numRows, 先将该字符串按z形排成numRows行,然后按行输出所有字符组成的新字符串。

举个栗子:
zigzag conversion

从中发现:

  1. 这些数字都与6有关,称为magicNum,该数与行数有关,举个不同行的例子,可以发现规律: magicNum = 2*(numRows - 1) ;
  2. 对于每行的第一个数字,是以2为步长依次递减的,当为0时,重新赋值为magicNum;
  3. 对同一行,已知一个步长,它的下一步步长为magicNum减去当前步长。

c++ 代码如下

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1)
            return s;
        string res = "";
        int magicNum = 2*(numRows - 1);
        for (int row = 0; row < numRows; ++row) {
            int initRowStep = magicNum - row*2; // 每行的起始步长
            if (initRowStep == 0) {             // 步长为0,重置为magicNum
                initRowStep = magicNum;
            }
            int step = initRowStep;
            for (int idx = row; idx < s.size(); ) {
                res += s[idx];
                idx += step;
                step = magicNum - step;
                if (step == 0) {
                    step = magicNum;
                }
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值