月模擬題2 201604 3 路徑解析

2021-10-04 22:36:52 字數 3008 閱讀 7219

在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄(或者資料夾)和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案或其他目錄。同乙個目錄下的所有檔案和目錄的名字各不相同,不同目錄下可以有名字相同的檔案或目錄。

為了指定檔案系統中的某個檔案,需要用路徑來定位。在類 unix 系統(linux、max os x、freebsd等)中,路徑由若干部分構成,每個部分是乙個目錄或者檔案的名字,相鄰兩個部分之間用 / 符號分隔。

有乙個特殊的目錄被稱為根目錄,是整個檔案系統形成的這棵樹的根節點,用乙個單獨的 / 符號表示。在作業系統中,有當前目錄的概念,表示使用者目前正在工作的目錄。根據出發點可以把路徑分為兩類:

絕對路徑:以 / 符號開頭,表示從根目錄開始構建的路徑。

相對路徑:不以 / 符號開頭,表示從當前目錄開始構建的路徑。

例如,有乙個檔案系統的結構如下圖所示。在這個檔案系統中,有根目錄 / 和其他普通目錄 d1、d2、d3、d4,以及檔案 f1、f2、f3、f1、f4。其中,兩個 f1 是同名檔案,但在不同的目錄下。

對於 d4 目錄下的 f1 檔案,可以用絕對路徑 /d2/d4/f1 來指定。如果當前目錄是 /d2/d3,這個檔案也可以用相對路徑 …/d4/f1 來指定,這裡 … 表示上一級目錄(注意,根目錄的上一級目錄是它本身)。還有 . 表示本目錄,例如 /d1/./f1 指定的就是 /d1/f1。注意,如果有多個連續的 / 出現,其效果等同於乙個 /,例如 /d1///f1 指定的也是 /d1/f1。

本題會給出一些路徑,要求對於每個路徑,給出正規化以後的形式。乙個路徑經過正規化操作後,其指定的檔案不變,但是會變成乙個不包含 . 和 … 的絕對路徑,且不包含連續多個 / 符號。如果乙個路徑以 / 結尾,那麼它代表的一定是乙個目錄,正規化操作要去掉結尾的 /。若這個路徑代表根目錄,則正規化操作的結果是 /。若路徑為空字串,則正規化操作的結果是當前目錄。

第一行包含乙個整數 p,表示需要進行正規化操作的路徑個數。

第二行包含乙個字串,表示當前目錄。

以下 p 行,每行包含乙個字串,表示需要進行正規化操作的路徑。

共 p 行,每行乙個字串,表示經過正規化操作後的路徑,順序與輸入對應。

7

/d2/d3

/d2/d4/f1..

/d4/f1

/d1/

./f1

/d1///f1

/d1/

////d1/..

/../d2

/d2/d4/f1

/d2/d4/f1

/d1/f1

/d1/f1

/d1/

/d2

1 ≤ p ≤ 10。

檔案和目錄的名字只包含大小寫字母、數字和小數點 .、減號 - 以及下劃線 _。

不會有檔案或目錄的名字是 . 或 . . ,它們具有題目描述中給出的特殊含義。

輸入的所有路徑每個長度不超過 1000 個字元。

輸入的當前目錄保證是乙個經過正規化操作後的路徑。

對於前 30% 的測試用例,需要正規化的路徑的組成部分不包含 . 和 . . 。

對於前 60% 的測試用例,需要正規化的路徑都是絕對路徑。

先要將目錄順序建立起來,這裡是用了兩個string陣列,乙個存當前目錄,另乙個存需要處理的目錄。首先解析當前目錄,題目說了它肯定是絕對目錄,不包含』.』、』. .』,因此僅判斷』/』,當遇到時將其之前的字串(即目錄名)存到陣列中,陣列中的次序也代表了目錄的上下關係。同樣的思路解析需要處理的目錄,但是情況多一些,先判斷是否為空串或相對路徑(根據首字母),若是,則要把當前目錄直接複製過來。依舊是碰到』/'時才處理,將所有情況列出,若tempstr內是".「則不需要處理,若是」. .",則目錄索引減1表示跳到上層目錄,但不能超過根目錄,若是新串,就作為目錄存入,並更新索引。解析完將陣列按一定格式輸出。

一開始混淆了題意,以為必須先把給出的整個目錄建出來,因此想了很久,是不是用map、二叉樹等等,後來發現不需要建。這只是乙個字串處理的問題,才開始用迴圈,分情況解析字串。迴圈完但是解析可能還沒完,要判斷字串是否為空,若非空則要把最後乙個更新進去。

由於題目中提及可能有空串,所以不能直接cin,要用getline讀取一行。中間還有乙個換行需要getchar讀出來。

#include

#include

using

namespace std;

const

int n =

1000+5

;string nowpath[n]

, ndpath[n]

;//當前目錄

int n;

intmain()

else}if

(tempstr.

length()

) nowpath[n++

]= tempstr;

// for(int i = 0; i < n; ++i) cout

;while

(p--

)else m =0;

//從頭開始

tempstr ="";

for(

int i =

0; i < len;

++i)

else

if(tempstr =="")

else ndpath[m++

]= tempstr;

tempstr ="";

}else}if

(tempstr.

length()

)else ndpath[m++

]= tempstr;}if

(!m) cout <<

"/";

for(

int i =

0; i < m;

++i)

cout << endl;

}return0;

}

SDU第二次月模擬題 201404 3路徑解析

在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄 或者資料夾 和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案或其他目錄。同乙個目錄下的所有檔案和目錄的名字各不相同,不同目錄下可以有名字相同的檔案或目錄。為了指定檔案系統中的某...

LeetCode寫題歷程 112 路徑總和

1.題目描述 給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點 2.解題思路 1 因為求得時根節點到葉子節點的路徑和,所以每一次遍歷的中止條件是當前節點的左右節點都為空。2 使用乙個中間變數temp對遍歷過程...

Leetcode刷題(437 路徑總和 III)

給定乙個二叉樹,它的每個結點都存放著乙個整數值。找出路徑和等於給定數值的路徑總數。路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的 只能從父節點到子節點 二叉樹不超過1000個節點,且節點數值範圍是 1000000,1000000 的整數。示例 root 10,5,3,3,2...