題目描述:
你需要設計乙個能提供下面兩個函式的檔案系統:
create(path, value): 建立乙個新的路徑,並盡可能將值 value 與路徑 path 關聯,然後返回 true。如果路徑已經存在或者路徑的父路徑不存在,則返回 false。
get(path): 返回與路徑關聯的值。如果路徑不存在,則返回 -1。
「路徑」 是由乙個或多個符合下述格式的字串連線起來形成的:在 / 後跟著乙個或多個小寫英文本母。
例如 /leetcode 和 /leetcode/problems 都是有效的路徑,但空字串和 / 不是有效的路徑。
好了,接下來就請你來實現這兩個函式吧!(請參考示例以獲得更多資訊)
示例 1:
輸入:[「filesystem」,「create」,「get」]
[,["/a",1],["/a"]]
輸出:[null,true,1]
解釋:filesystem filesystem = new filesystem();
filesystem.create("/a", 1); // 返回 true
filesystem.get("/a"); // 返回 1
示例 2:
輸入:[「filesystem」,「create」,「create」,「get」,「create」,「get」]
[,["/leet",1],["/leet/code",2],["/leet/code"],["/c/d",1],["/c"]]
輸出:[null,true,true,2,false,-1]
解釋:filesystem filesystem = new filesystem();
filesystem.create("/leet", 1); // 返回 true
filesystem.create("/leet/code", 2); // 返回 true
filesystem.get("/leet/code"); // 返回 2
filesystem.create("/c/d", 1); // 返回 false 因為父路徑 「/c」 不存在。
filesystem.get("/c"); // 返回 -1 因為該路徑不存在。
對兩個函式的呼叫次數加起來小於等於 10^4
2 <= path.length <= 100
1 <= value <= 10^9
方法1:
(1)構建字典樹;
(2)將給出的路徑先進行分割,得到每一級的結點字串,若該字串在字典樹中有結點,則接著在字典樹中遍歷,若沒有,則判斷當前結點是否是分割路徑中的最後乙個結點,若是,則生成對應結點,並返回true;否則返回false;
(3)對於get函式,同樣將路徑先進行分割,判斷路徑的存在性即可;
struct node
;class
filesystem
//將給定的字串進行分割,獲得乙個個結點
void
split_path
(string&path,vector
&paths)
string str=path.
substr
(i+1
,index-i-1)
;if(!str.
empty()
)}i=index-1;
}}bool
createpath
(string path,
int value)
vector paths;
split_path
(path,paths)
;//分割路徑
if(paths.
empty()
) node* tmp=root;
for(
int i=
0;isize()
;++i)
else
}else
}return
false;}
intget
(string path)
else
}return tmp-
>value;}}
;/**
* your filesystem object will be instantiated and called as such:
* filesystem* obj = new filesystem();
* bool param_1 = obj->createpath(path,value);
* int param_2 = obj->get(path);
*/
方法2:
主要思路:
(1)改為go**
type filesystem struct
func
constructor
() filesystem
}func
(this *filesystem)
createpath
(path string
, value int
)bool
paths := strings.
split
(path,
"/")
for i:=
1;i<
len(paths)
;i++
return
true
}else
}else
}return
false
}func
(this *filesystem)
get(path string
)int
else
}return this.value;
}/**
* your filesystem object will be instantiated and called as such:
* obj := constructor();
* param_1 := obj.createpath(path,value);
* param_2 := obj.get(path);
*/
檔案系統設計考慮
乙個磁碟可以有數個分割槽,典型的unix系統中每個磁碟分割槽會有幾個檔案系統。順序介紹幾個概念,會對以後的問題更為清晰。主引導記錄 master boot record 整個磁碟的0號扇區。它的最基本作用就是引導載入計算機的作業系統。過程如下 1.計算機啟動bios 2.bios讀入執行mbr 3....
檔案系統 why檔案系統
為什麼需要檔案系統,可否由作業系統直接寫裸裝置?裸裝置是一種沒有經過格式化的磁碟或分割槽,即讓作業系統直接管理操作磁碟設定,進行資料讀寫等。通過檔案系統的方式組織磁碟儲存和資料管理有很多好處,比如 1.資料讀取 管理等操作變得簡單便捷 檔案系統給使用者提供了乙個簡單的操作介面,只需簡單的操作就能實現...
FAT 檔案系統設計思想
1 fat1 fat2 緊挨保留扇區之後 2 fat1 fat2 中內容都是關於檔案 目錄的簇號連線。3 資料區中檔案和目錄的屬性。檔案為使用者的資料集。目錄為檔案和子目錄的目錄項集。1 保留扇區 fat12 16 通常為1扇區,fat32 通常為32 扇區 2 db t12 16 只有乙個 損壞不...