CCF 路徑解析

2021-10-04 19:43:14 字數 3413 閱讀 7492

試題編號:201604-3

試題名稱:路徑解析

時間限制:1.0s

記憶體限制:256.0mb

問題描述:

在作業系統中,資料通常以檔案的形式儲存在檔案系統中。

檔案系統一般採用層次化的組織形式,由目錄(或者資料夾)和檔案構成,形成一棵樹的形狀。

檔案有內容,用於儲存資料。目錄是容器,可包含檔案或其他目錄。

同乙個目錄下的所有檔案和目錄的名字各不相同,不同目錄下可以有名字相同的檔案或目錄。

為了指定檔案系統中的某個檔案,需要用路徑來定位。

在類 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% 的測試用例,需要正規化的路徑都是絕對路徑。

首先,把題意簡單提煉一下,主要題意為:

絕對路徑:/***x,從根目錄開始

相對路徑:***x,從當前目錄開始

正規化:不含.或…,不含多個連續的/,結尾不是/

特別地:指向根目錄,輸出/;空字串,輸出當前目錄。

因為最後要輸出的都是絕對路徑,所以不管輸入是什麼,都轉化為絕對路徑。

#include

#include

#include

using

namespace std;

char cal[

1005];

string str;

int location=0;

intmain()

//結尾/

while

(str[str.

length()

-1]==

'/'&&str.

length()

>1)

//連續出現/

while

((location=str.

find

("//"))

!=-1)

//處理.

while

((location=str.

find

("/./"))

!=-1)

//刪除..

while

((location=str.

find

("/../"))

!=-1)

else

str.

erase

(location,cnt);}

}printf

("%s\n"

,str.

c_str()

);}return0;

}

本體總體來說,演算法和思路都不難,也沒有用到經典演算法,只需要根據題目需求把各個功能都實現就可以,主要需要注意的是,充分考慮各種情況的情況,以下是本次沒有考慮到的幾個位置:

最開始每個while,我都用的if,同時沒有用find函式,都用的變數i來定位和確定輸入情況,但是這裡的問題是,當處理完i及之前的字元之後,i還處於原地,直接繼續從i向下執行了,這樣漏掉了刪除操作之後對i前面字元的檢查,會出現錯誤。

修改時我為了不出現大的改動,不再for中寫i++,而是在所有if都完成後再i++,同時,在任何乙個if/else中,只要有對應的操作,都加了i=0;continue;希望每次進行完操作後都重新返回首字元位置。但是這樣依然出錯。所以,最後大改動直接全部變為while,直到不再存在這種問題後,才進行下一種情況的處理。

當全部變為while後,反而不需要考慮那麼多問題,直接for迴圈,內部對所有情況分別while,每個while完全排除所有這種問題的可能性,每個輸入走一遍全部流程,就可以得到最終輸出結果。

CCF路徑解析

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

CCF 路徑解析

思路本題就是乙個簡單的字串操作的問題,具體分為以下情況 1.的形式代表的是當前目錄,所以之間刪除 即可,保留最後乙個 2.的形式代表的是上一級目錄,所以需要刪除 代表當前目錄,刪除即可回到上一級。3.連續多個 直接刪除留下乙個即可。4.最後乙個 直接刪除。本題有乙個點,就是用scanf輸入字串的話不...

CCF 路徑解析題解

有一段時間沒有寫ccf題了,今天花了一點時間自己寫了道題。花點時間來寫篇題解mark一下。題目鏈結入下,相信能看到這個題解的人都應該很熟悉題目 這個題的題意大致如下 給出一些表示路徑的字串,然後需要實現按一定規則將路徑正規化。正如ccf大多數第三題的套路,按一定的規則做一些字串的處理,這題也不例外,...