lt.588 設計內存文件系統

設計一個內存文件系統,模擬以下功能:

ls: 以字符串的格式輸入一個路徑。如果它是一個文件的路徑,那麼函數返回一個列表,僅包含這個文件的名字。如果它是一個文件夾的的路徑,那麼返回該 文件夾內 的所有文件和子文件夾的名字。你的返回結果(包括文件和子文件夾)應該按字典序排列。

mkdir:輸入一個當前不存在的 文件夾路徑 ,你需要根據路徑名創建一個新的文件夾。如果有上層文件夾路徑不存在,那麼你也應該將它們全部創建。這個函數的返回類型爲 void 。

addContentToFile: 輸入字符串形式的 文件路徑 和 文件內容 。如果文件不存在,你需要創建包含給定文件內容的文件。如果文件已經存在,那麼你需要將給定的文件內容 追加 在原本內容的後面。這個函數的返回類型爲 void 。

readContentFromFile: 輸入 文件路徑 ,以字符串形式返回該文件的 內容 。

示例:

輸入:
["FileSystem","ls","mkdir","addContentToFile","ls","readContentFromFile"]
[[],["/"],["/a/b/c"],["/a/b/c/d","hello"],["/"],["/a/b/c/d"]]

輸出:
[null,[],null,null,["a"],"hello"]

struct trie {
    bool isFile;
    string content;
    map<string, trie*> next;
    trie() : isFile(false) {}
};
class FileSystem {
public:
    FileSystem() {
        root = new trie();
    }
    vector<string> ls(string &path) {
        vector<string> pathArray = pathSplit(path);
        trie* cur = root;
        for (const auto &each : pathArray) {
            cur = cur->next[each];
        }
        vector<string> result;
        if (cur->isFile) {
            result.push_back(pathArray.back());
        } else {
            for (const auto &each : cur->next) {
                result.push_back(each.first);
            }
        }
        return result;
    }
    void mkdir(string &path) {
        vector<string> pathArray = pathSplit(path);
        trie *cur = root;
        for (const auto &each : pathArray) {
            if (cur->next.count(each) == 0) {
                cur->next[each] = new trie();
            }
            cur = cur->next[each];
        }
    }
    void addContentToFile(string &filePath, const string& content) {
        vector<string> fileArray = pathSplit(filePath);
        trie *cur = root;
        for (const auto &each : fileArray) {
            if (cur->next.count(each) == 0) {
                cur->next[each] = new trie();
            }
            cur = cur->next[each];
        }
        cur->isFile = true;
        cur->content += content;
    }
    string readContentFromFile(const string& filePath) {
        vector<string> fileArray = pathSplit(filePath);
        trie* cur = root;
        for (const auto &each : fileArray) {
            cur = cur->next[each];
        }
        return cur->content;
    }
private:
    trie *root;

    static vector<string> pathSplit(const string& path)
    {
        stringstream ss(path);
        string s;
        vector<string> answer;
        if (path.empty()) {
            return answer;
        }
        while (getline(ss, s, '/')) {
            answer.push_back(s);
        } //這裏注意開始會有一個空字符
        return vector<string>(answer.begin() + 1, answer.end());
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章