6. Z字形变换

将字符串 "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

思路

按照与逐行读取 Z 字形图案相同的顺序访问字符串。

算法

首先访问 行 0 中的所有字符,接着访问 行 1,然后 行 2,依此类推…

对于所有整数 k,

  • 行 0 中的字符位于索引k(2⋅numRows−2) 处;
  • 行numRows−1 中的字符位于索引 k(2⋅numRows−2)+numRows−1 处;
  • 内部的 行 i 中的字符位于索引 k(2⋅numRows−2)+i 以及 (k+1)(2⋅numRows−2)−i 处;

class Solution {
public:
    string convert(string s, int numRows) 
    {
        if(numRows==1)
           return s;
        int step=2*(numRows-1);
        int n=s.size();
        string ret=””;
        for(int i=0;i<n;i=i+step)
        {
            ret=ret+s[i];
        }
        for(int i=1;i<numRows-1;i++)
        {
            for(int j=i;j<n;j=j+step)
            {
                ret=ret+s[j];
                if(j+step-2*i<n)
                    ret=ret+s[j+step-2*i];
            }
        }
        for(int i=numRows-1;i<n;i=i+step)
        {
             ret=ret+s[i];
        }
        return ret;
    }
};

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/zrh_CSDN/article/details/81665238
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞