【中】6Z変換ジグザグ変換

タイトル

文字列「PAYPALISHIRING」は、次のように指定された数の行にジグザグパターンで書き込まれます(読みやすいように、このパターンを固定フォントで表示することもできます)。

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

そして、行ごとに読みます: "PAHNAPLSIIGYIR"

文字列を取得するコードを記述し、いくつかの行を指定してこの変換を行います。

指定された文字列を、指定された行数に従って、上から下、左から右へジグザグパターンに配置します。

たとえば、入力文字列が "LEETCODEISHIRING"で、行数が3の場合、配置は次のようになります。

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

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

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

ソース:LeetCode
リンク:https ://leetcode.com/problems/zigzag-conversion

解決策

方法1:行番号を文字ごとに決定する

問題解決のアイデア

行の数がnumRowsで、文字が最初の行から下になり、後続の文字列が下に移動することを確認します。下にできない場合は上に移動します。nunrows文字列を使用して各行の文字を格納し、最後にそれらを接続します。

コード

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows < 2) return s;
        string result[numRows];
        for(int i = 0; i < numRows; ++i) result[i] = "";
        int curr = 0, dir = 1;
        for(int i = 0; i < s.length(); ++i){
            result[curr] += s[i];
            if(curr == numRows-1) dir = -1;
            else if(curr == 0) dir = 1;
            curr += dir;
        }
        string res = "";
        for(int i = 0; i < numRows; ++i){
            res += result[i];
        }
        return res;
    }
};

方法2:行ごとに文字を決定する

問題解決のアイデア

numRows = 0およびnumRows = 1を除くnumRows行データの場合、groupnum = 2 numRows-2の数値は、合計nグループのグループに分割できます。このとき、行番号iには、行0とnumRows-1を除いて、index = i + t goupnum(0 <= t <= n、0 <= index <s.length())の文字が必要です。行、各グループの行には2つの文字があります。つまり、i +(t + 1)goupnum-2 i =(t + 1)* groupnum-iもこの行にあるため、各グループを順番に出力するだけですラインに落ちるキャラクターだけ

コード

class Solution {
public:
    string convert(string s, int numRows) {
        string result = "";
        if(numRows < 2) return s;
        int group_num = numRows+numRows-2, line = 0;
        for(int i = 0; i < numRows; ++i){
            int pos = i;
            while(pos < s.length()){
                result = result+s.substr(pos, 1);
                pos += group_num;
                if(i != 0 && i != numRows-1 && pos-i*2 < s.length()){
                    result = result+s.substr(pos-i*2, 1);
                }
            }
        }
        return result;
    }
};

まとめ

  1. 方法2には多くの計算が含まれるため、コストは方法よりも大きくなります。

おすすめ

転載: www.cnblogs.com/suata/p/12711824.html