滞在ボタン71--簡素化パス

オリジナルタイトル

絶対パスを与えるために、Unixスタイルのファイル、あなたはそれを単純化する必要があります。換言すれば、パス指定に変換します。

Unix形式のファイルシステムでは、ドットは、カレントディレクトリ自体を表す(。);また、2つのドット(..)は、(親ディレクトリ)にディレクトリを表し、比較的複雑な経路であってもよい両方とも一部。詳細については、以下を参照してください。相対パス対のLinux / Unixの絶対パスを

仕様は、/常に先頭に/スラッシュでパスに戻らなければならない、と2つのスラッシュの間だけ1つのディレクトリ名を持たなければならないことに注意してください。(があれば)最後に、ディレクトリ名は/で終わるわけで。また、仕様は、絶対パス文字列でなければならない最短経路を表します。

例1:

输入:"/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。

例2:

输入:"/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。

例3:

输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

例4:

输入:"/a/./b/../../c/"
输出:"/c"

例5:

输入:"/a/../../b/../c//.//"
输出:"/c"

例6:

输入:"/a//b////c/d//././/.."
输出:"/a/b/c"

原题URL:https://leetcode-cn.com/problems/simplify-path/

ソリューション

それは見ることは困難ではありませんが、以来、私はそれを起動することは不可能だった開始時間を得ました。

スタックを使用します

参照してください..戻って考えるのは特に簡単に、それのロジックを、そしてあるべきバック最も便利なデータ構造を記録することであるアップ。.あなたはコンテンツに想像することができ、無視することができますが、/それは区切り文字として使用することができ、コードを見て:

class Solution {
    public String simplifyPath(String path) {
        // 存储路径
        Stack<String> stack = new Stack<>();
                
                // 分隔
        String[] array = path.split("/");
        for (String str : array) {
                        // 忽略
            if (str.equals("") || str.equals(".")) {
                continue;
            }
                        
                        // 后退
            if (str.equals("..")) {
                stack.pop();
                continue;
            }
                        
                        // 需要存储的内容
            stack.push(str);
        }

        StringBuilder sb = new StringBuilder();
        for (String str : stack) {
            sb.append("/").append(str);
        }
                // 如果内容为空,则需要输出"/"
        if (sb.length() == 0) {
            sb.append("/");
        }
        return sb.toString();
    }
}

これは、提出を与えられた後、非常に良さそうに見えます。彼は言ったstack.push(str);、この行が例外をスローしたjava.util.EmptyStackExceptionスタックが空であるか、まだ(それが全体的な問題を考えていないようです)の最上位レベルで必要であれば、確かに、。私たちは、以下のコードを最適化してみましょう:

class Solution {
    public String simplifyPath(String path) {
        // 存储路径
        Stack<String> stack = new Stack<>();
                
                // 分隔
        String[] array = path.split("/");
        for (String str : array) {
                        // 忽略
            if (str.equals("") || str.equals(".")) {
                continue;
            }
                        
                        // 后退
            if (str.equals("..")) {
                            // 判断是否为空,不为空,才需要回退
                if (!stack.empty()) {
                    stack.pop();
                }
                                // 无论stack空不空,都需要结束
                continue;
            }

            stack.push(str);
        }

        StringBuilder sb = new StringBuilder();
        for (String str : stack) {
            sb.append("/").append(str);
        }
        if (sb.length() == 0) {
            sb.append("/");
        }
        return sb.toString();
    }
}

:によって実行されたときにOK、それは、渡された6msメモリ36.2MB消費量:

概要

この質問は、あなたが理解していれば、私は知らない、私の答えプロセスを上回っています。これらは、すべての問題解決のプロセスをいっぱいになりますので、ブラシは、トピックの数を持って前にあるため、としても見直さ。私はタイトルがメディアを選択されたブラシ、それは私が本当にやる気、あまりにもハード非常に簡単に感じる話題を磨く、大手外資系企業は、このようなインタビューは主に対象ベースで考えて、難しいことではないだろう。私たちはあなたと一緒に進行状況を作ることを願っています。

公共の数、見出し番号を私のブログを訪問するか、私に従うことができます興味を持っている、多分驚きがあるでしょう。

https://death00.github.io/

公開番号:建チェンロード

おすすめ

転載: www.cnblogs.com/death00/p/12081292.html