您的位置:首页 > 编程语言 > C语言/C++

@LeetCodeZ字形变换--ZigZag Conversion[C++]

2019-02-01 15:52 232 查看

@LeetCodeZ字形变换--ZigZag Conversion[C++]

  • 程序实现
  • 问题描述

    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

    比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。

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

    string convert(string s, int numRows);

    示例1:

    示例2:

    解决方法及复杂度分析

    按行排序

    思路

    通过从左向右迭代字符串,可以轻松地确定字符位于 Z 字形图案中的哪一行。

    算法

    可以使用 min(numRows,len(s))min(numRows,len(s))min(numRows,len(s)) 个列表来表示 Z 字形图案中的非空行。

    从左到右迭代 sss,将每个字符添加到合适的行。可以使用当前行和当前方向这两个变量对合适的行进行跟踪。

    只有当向上移动到最上面的行或向下移动到最下面的行时,当前方向才会发生改变。

    复杂度分析

    • 时间复杂度:O(n)O(n)O(n),其中 n=len(s)n = len(s)n=len(s)
    • 空间复杂度:O(n)O(n)O(n)

    按行访问

    思路

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

    算法

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

    对于所有整数 kkk,

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

    复杂度分析

    • 时间复杂度:O(n)O(n)O(n),其中 n=len(s)n =len(s)n=len(s)。每个索引被访问一次。
    • 空间复杂度:O(n)O(n)O(n)。

    程序实现

    按行排序

    class Solution {
    public:
    string convert(string s, int numRows) {
    if(numRows == 1) return s;
    vector<string> rows(min(numRows, int(s.size())));
    int curRow = 0;
    bool goingDown = false;
    for(char& c : s) {
    rows[curRow] += c;
    if(curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
    curRow += goingDown ? 1 : -1;
    }
    string ret;
    for(string& row : rows) ret += row;
    return ret;
    }
    };

    按行访问

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

    @山东·威海 2019.02.01

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: