zoukankan      html  css  js  c++  java
  • #leetcode刷题之路6- Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
    比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
    L     C     I   R
    E T O E S I I G
    E    D     H  N
    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
    请你实现这个将字符串进行指定行数变换的函数:
    string convert(string s, int numRows);

    示例 1:
    输入: s = "LEETCODEISHIRING", numRows = 3
    输出: "LCIRETOESIIGEDHN"

    示例 2:
    输入: s = "LEETCODEISHIRING", numRows = 4
    输出: "LDREOEIIECIHNTSG"
    解释:

    L        D        R
    E    O E     I  I
    E C     I   H   N
    T        S       G

     思路:找规律,怎么找呢?

    我们换一种方式来看这道题:

    例如:字符串123456789...16和字符串123456789...21

    规律1:在我圈出的每一列中,同一行之间的相邻数字只差为 len=2*nRows-2,这也就意味着我们知道了第一列每一行的元素,后面的也就全部知道了。

    那么问题来了,除了第一行和最后一行,其他行的相邻元素之间会多出现一个字符。。。所以在这些行中,我们要多考虑这些多余的字符。

    规律2:这些多余字符的位置也是有规律的,他们和同一行的前一个元素的位置相差len-2*i,也就是说,多余字符的位置为dif=j+len-2*i

    ok,按这个规律来做这个题:

    #include <iostream>
    using namespace std;
    
    string convert(string s, int nRows)
    {
        if (nRows <2)
            return s;
        string ans="";
        int len = 2 * nRows - 2;
        for (int i = 0; i < nRows; ++i)
        {
            for (int j = i; j < s.length(); j += len)
            {
                ans += s[j];
                int dif = j +len - 2 * i;
                if ((i != 0) && (i != (nRows - 1)) &&(dif < s.length()))
                    ans += s[dif];
            }
        }
        return ans;
    }
    
    
    int main() {
        string s="abcdefghijklmn";
        string ans=convert(s,3);
        std::cout <<ans << std::endl;
        return 0;
    }

    c/c++中sizeof()、strlen()、length()、size()详解和区别

  • 相关阅读:
    P1099 [NOIP2007 提高组] 树网的核
    UVA 数学题选做
    Codeforces 729 Div.2
    P1600 [NOIP2016 提高组] 天天爱跑步
    CF1106F Lunar New Year and a Recursive Sequence
    P6091 【模板】原根
    P4774 [NOI2018] 屠龙勇士
    P1106 删数问题
    P1209 [USACO1.3]修理牛棚 Barn Repair
    网络(network)
  • 原文地址:https://www.cnblogs.com/biat/p/10440872.html
Copyright © 2011-2022 走看看