問題の意味
文字列「PAYPALISHIRINGは、」このような、一定の行数にジグザグパターンで書かれている:(あなたがより良い読みやすさのために、固定フォントで、このパターンを表示したい場合があります)
翻訳
文字列を考えると、それは、蛇行出力となります。蛇のような抽象的な概念、我々は理解するサンプルを結合する必要があります。
サンプル
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P I
分析
この問題は質問の最初の蛇行良いに配置されている与えられた文字列を意味するビット鬼畜を意味し、その後読んで、そして最後に新しい文字列にするためにラインを押してください。
LeetCodeにこの質問の難しさはあるもののミディアム、実際には、それは非常に簡単です。それは非常にシンプルとみなされているよりも、質問に、マンチェスターアルゴリズム。LeetCode 5マンチェスターアルゴリズム迅速回文配列を決定
この質問は、私たちに、文字列や蛇行状に配置されたラインのヘビねじれた文字列の数を教えてくれます。これは、任意のアルゴリズムやデータ構造、イタリアはシミュレーションの質問と呼ばれているという認識の問題だけを持っていません。明らかに、今日この問題は、シミュレーションの質問です。唯一の問題は、実際に、それはエンジニアリング能力のテストで、より複雑な機能のいくつかを達成するために、シミュレーションコードの難しさです。
なぜなら、我々は唯一の出力の最後の行接続蛇のような配置は、また、非常に簡単です。我々は、位置情報の列を無視することができますので、興味のある唯一のラインだけで罰金を置きます。行数が限られているので、行ごとに、我々は、レコードの文字列を、一緒に罰金に接続されているすべての行の結果のための最後の行で、これまでに現在の行の文字列を置くことができます。観察を通じて、我々は簡単に定期的サイクルである列に配置され、見つけることができます。たrowNumインクリメントする0から、2 - - 1サイクルは2 * rowJum 1を、そしてその後1に減少します。
法則の発見後、コードを書くことは難しいことではありません。
def convert(text, numRows):
# 记录每一行结果的dict
lines = {}
if numRows == 0:
return text
for i in range(len(text)):
# 计算应该放在哪一行
idx = i % (2 * numRows - 2)
# 判断是在递增区间还是递减区间
if idx >= numRows:
idx = 2 * numRows - 2 - idx
line = lines.get(idx, "")
lines[numRows] = line + text[i]
result = ""
# 拼接答案
for i in range(numRows):
result += lines[i]
return result
上記のコードは非常にシンプルですが、最適化することが可能な場所に隠されました。
辞書の使用することを、dictのクエリは、オーバーヘッドが必要です。実際には、我々はできる配列を置き換える我々は行数を特定しているので、配列の長さが固定されているので、。このような最適化した後、時間効率が少し高くなります。違いは、コードホールド素晴らしいではありません。しかし、私たちは理解したいことができるはずだと思います。
それが収穫された場合、ここで今日の記事では、タップの懸念にそれを。