毎日1題LeetCode[初日]

3335 ワード

毎日1題LeetCode[初日]
ZigZagConversion
Description:
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
 P   A   H   N
 A P L S I I G
 Y   I   R

And then read line by line: “PAHNAPLSIIGYIR” Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);

convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.
解題プロセス:
  • 最初はテーマ意識を理解していたとき、間違いました.のだから、問題意識を素早く理解するには、私はまだ欠けています.
  • テーマ意識を理解した後、基本方向は2次元配列に似ていて、最初は物を垂直に下の方向に充填して、つなぎ合わせて出力して、大体の考え方はこのようにして、普通の人はすべて考えることができます.肝心なのは、具体的な細部のコードをきれいにできるかどうかです.最初はchar 2次元配列を直接開きたいと思っていましたが、このような考えはあまりにもNaive的で、効率が低く、どれだけ大きく開くかも問題でした.後で標答を見ました:Javaで書いたので、確かにきれいな感じがします.具体的なコードは以下を見て、Javaでは文字列の処理に対して、StringBuilderでできるだけStringBuilderを使うことができます(StringBufferはスレッドが安全で、これはスレッドが安全ではありませんが、効率が高いことを覚えておいてください).2次元配列は1次元のStringBuilderで代用され、具体的な内部ループはこのように見ることができ、1回のループが1回の垂直下向き充填+斜め上向き充填を完了し、文字列iの下付き文字が木を超えているかどうかを判断する判断を加える.

  • Javaコード:
    public class ZigZagConversion {
    
        private static final String TAG=ZigZagConversion.class.getSimpleName();
    
        public String zigZagConvet(String text,int nRows){
            //change to char array --convenience to use
            char [] c=text.toCharArray();
            StringBuilder[] sbs=new StringBuilder[nRows];
            //init sb
            for(int i=0;inew StringBuilder();
            int i=0,len=text.length();
            while (i//vertical down
                for(int id=0;id//obliquely up
                for(int id=nRows-2;id>=1 && i//add all sb
            for(int id=1;id0].append(sbs[id]);
            }
            return sbs[0].toString();
        }
    }

    コードの品質を高めることは:毎日美しい構想を蓄積して、良質な細部の過程です.