LeetCode 6.ジグザグConversionZフォント変換

LeetCode 6.ジグザグConversionZフォント変換

6.ジグザグ変換

文字列は、"PAYPALISHIRING"このような、一定の行数にジグザグパターンで書かれている:(あなたがより良い読みやすさのために、固定フォントで、このパターンを表示したい場合があります)

P   A   H   N
A P L S I I G
Y   I   R

そして、行ずつ読んで: "PAHNAPLSIIGYIR"

文字列を取ると、この変換は、行数を与えられたようになりますコードを書きます:

string convert(string s, int numRows);

例1:

Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

例2:

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
直接ジャンプ法(横向き)

2 - 最初と最後の行のために行くの法則によると、我々は彼の次の要素が2 * NUMROW距離にする要素を見つけることができます。

中間要素のために、私たちはその要素に関連する彼の次のステップを発見した可能性があります。2 - 私たちは、各列A、2 * NUMROWの要素C列完全距離の最初の要素からカウントを開始することができます。次の要素が必然的要素Bの完全なリストの前に発生します達します 即ち、2 * NUMROWためA-> B-> Cの総距離 - 2。A-> Bプラス距離B-からながら、> Cは、総距離に等しいです。したがって、ステップ(B - > C)のステップ= 2 * numRowsの数 - 2 - ステップ(A-> B)。

上記の簡単インデックスと図をプロットすることによって検証すること。そのような時間計算量はO(n)は、複雑度はO(n ^ 2)の空間的な程度であります

public String convert(String s, int numRows) {
        if(numRows == 1){
            return s;
        }
        
        StringBuilder res = new StringBuilder();
        int len = s.length();
        for(int i = 0; i < len; i = i + 2 * numRows - 2){
            res.append(s.charAt(i));
        }
        
        for(int i = 1; i < numRows - 1; i++){
            int step = 2*i;
            int index = i;
            while(index < len){
                res.append(s.charAt(index));
                step = 2 * numRows - 2 - step;
                index += step;
            }
        }
        
        for(int i = numRows - 1; i < len; i = i + 2 * numRows - 2){
            res.append(s.charAt(i));
        }
        
        return res.toString();
    }
ジッパー法(垂直距離)

ステッチは、文字列を押すことで元の順番を取ることです。ジッパー方法に似ています。NUMROWSは、各アレイがリンクされたリストに対応する、配列の長さを設定します。これは、その後の位置に対応する文字列の各文字に追加されました。押して、リストの出力文字列をリンク。そのような時間計算量はO(n)は、複雑度はO(n ^ 2)の空間的な程度であります

public String convert(String s, int numRows) {

    if (numRows == 1) return s;

    List<StringBuilder> rows = new ArrayList<>();
    for (int i = 0; i < Math.min(numRows, s.length()); i++)
        rows.add(new StringBuilder());

    int curRow = 0;
    boolean goingDown = false;

    for (char c : s.toCharArray()) {
        rows.get(curRow).append(c);
        if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
        curRow += goingDown ? 1 : -1;
    }

    StringBuilder ret = new StringBuilder();
    for (StringBuilder row : rows) ret.append(row);
    return ret.toString();
}
ringBuilder();
    for (StringBuilder row : rows) ret.append(row);
    return ret.toString();
}
发布了36 篇原创文章 · 获赞 8 · 访问量 3万+

おすすめ

転載: blog.csdn.net/qq_32763643/article/details/104066042