A. 問題の説明
絶対パスを与えるために、Unixスタイルのファイル、あなたはそれを単純化する必要があります。換言すれば、パス指定に変換します。
Unix形式のファイルシステムでは、ドットは、カレントディレクトリ自体を表す(。);また、2つのドット(..)は、(親ディレクトリ)にディレクトリを表し、比較的複雑な経路であってもよい両方とも一部。詳細については、以下を参照してください。相対パス対のLinux / Unixの絶対パスを
仕様は、常に先頭に/スラッシュでパスに戻らなければならない、と2つのスラッシュの/の間に一つだけのディレクトリ名を持たなければならないことに注意してください。(があれば)最後に、ディレクトリ名は/で終わるわけで。また、仕様は、絶対パス文字列でなければならない最短経路を表します。
例1:
入力: "/ホーム/"
出力:「/ホーム」
説明:最後のディレクトリ名の後ろにスラッシュがあることに注意してください。
例2:
入力: "/../"
出力: "/"
説明:ルートは、あなたが到達できる最高レベルであるため、ルートレベルから上は、現実的ではありません。
例3:
入力: "/ホーム// fooの/"
出力: "/ホーム/ foo" という
説明:指定のパスで、連続スラッシュ複数のスラッシュで置き換えます。
例4:
入力: "/ A /./ B /../../ C /"
出力: "/ C"
例5:
入力: "/../../のB / C /../ //.//"
出力: "/ C"
例6:
入力: "/ A // B //// C / Dの//./.// .."
出力: "/ A / B / C"
II。問題解決のためのアイデア
スタックを通じて問題を解決するための主な質問。
最初のディレクトリリストの各リスト一つ一つに格納された「/」で:ステップ。
ステップ2:それがある場合は最初からリスト一覧比較では、「..」の元と現在は削除されます。それがある場合は削除後、現在の。「」
ステップ3:最後に、すべてのリストを追加「/」出力文字列が必要です。
III。結果
実行時:6ミリ秒は、Javaの提出内のすべてのユーザーの95.32パーセントを打ちます
メモリ消費量:38.1メガバイトには、Javaの提出内のすべてのユーザーの87.20パーセントを破りました
IV。Javaコード
クラスソリューション{ パブリック文字列simplifyPath(文字列のパス){ 一覧 <文字列>リスト= 新しいのArrayList <文字列> (); int型最初= 0 ; int型 = 0秒。 以下のために(int型 i = 0; I <= path.length();) { もし(I == path.length()|| path.charAt(I)== '/' ) { もし(第2> 第一) { list.add(path.substring(第 1、第二+ 1 ))。 もし(list.get(はlist.size() - 1).equals( "" )) { list.remove(はlist.size() -1 )。 } それ以外の 場合(list.get(はlist.size() - 1).equals( "..")&&はlist.size()> 1 ) { list.remove(はlist.size() -1 )。 list.remove(はlist.size() -1 )。 } そう であれば(list.get(はlist.size() - 1).equals( "..")&&はlist.size()== 1 ) { list.remove(はlist.size() -1 )。 } 第一 = 二; I = 1 +秒。 } 他 { 最初 = I; I ++ ; } } 他 { 二 = I; I ++ ; } } 文字列のTEMP = "" ; もし(はlist.size()== 0 ) { リターン "/" ; } 用(INT m = 0であり、m <はlist.size(); M ++ ) { 温度 =温度+ "/" ; TEMP = TEMP + list.get(M)。 } 戻り温度; } }