第二次月模擬題 201604 3

2021-10-23 02:20:28 字數 3271 閱讀 3204

題目描述:

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

為了指定檔案系統中的某個檔案,需要用路徑來定位。在類 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 行,每行乙個字串,表示經過正規化操作後的路徑,順序與輸入對應。

sample:

input:

7/d2/d3

/d2/d4/f1

…/d4/f1

/d1/./f1

/d1///f1

/d1/

////d1/…/…/d2  

output:

/d2/d4/f1

/d2/d4/f1

/d1/f1

/d1/f1

/d1/

/d2題目分析:

本題描述非常複雜,但是我們只要掌握了其中幾個要點就能解決問題。

首先是相對路徑和絕對路徑的問題,最終我們要輸出的是絕對路徑,所以我們要先把相對路徑轉換為絕對路徑,這樣處理方法就是當前目錄+「/」+相對路徑=絕對路徑,至於相對路徑裡面帶的「…」可以在後面一起處理

if

(strt[0]

!='/'

)

接下來變成絕對路徑之後就可以處理符號了,那麼題目描述有這麼幾種情況:

如果是有多個「/」,那麼我們取乙個。所以我們就需要乙個字串記錄最終結果,還要有乙個變數來記錄下是否是已經由「/」了。如果讀到了「/」,且是第一次讀到,那麼就把後面的字元(也就是位址)放到結果字串裡,如果不是第一次讀那就往後找,也就是忽略「/」。這樣我們就把「/」全部刪掉了。這裡注意字串的大小範圍是從第二個(下標是1)開始(因為第乙個變為絕對位址一定是「/」),終點是最後乙個,因為我們上面讀取資料的時候有乙個cin.ingore,也就是忽略掉輸入的前乙個字元,那麼我們的字串結尾用\0判斷就沒有意義了,為了簡單我們先用乙個變數儲存字串長度,然後用字串長度來代替函式,防止超時。

bool flag =1;

int size1=strt.

size()

;for

(int j=

1;j<=size1;j++

)else

}else

下一步就是處理.與…的問題了,題目描述是遇到了.就取當前目錄,但是我們上面的計算裡面把.也算進去了,所以意味著如果遇到了.就直接刪掉它就可以了。

else

if(v[i]

[j]==

".")

如果遇到了…那麼就是轉換成當前目錄,之前我們轉換為絕對位址的演算法是當前目錄+「/」+輸入位址,那麼我們發現當前目錄的最後和輸入位址的第乙個是並列的(比如樣例中的d3和d4),那麼我們就需要看當前目錄是不是根目錄,如果是根目錄只需要刪除乙個就行,如果不是根目錄,就需要刪除「/」和並列的目錄

if

(v[i]

[j]==

".."

)else

}

處理完之後就可以輸出了,這樣輸出的時候如果只有根目錄就輸出「/」,沒有的話就先輸出乙個/再輸出後面的字元

int size3=v[i]

.size()

;if(size3==0)

else

} cout << endl;

**如下:

#include

#include

using

namespace std;

intmain()

string temp ="";

bool flag =1;

//標記是否是乙個/

CodeVS第二次月賽 B

題目描述 description 切記不要加任何檔案讀寫,本次比賽暫不支援ifndef online judge。請互相轉告。評測機是linux 是個富有詩意的男孩。在他居住的小鎮上,有 n個村莊,由 n 1條道路連線著。這裡的生活和諧而又寧靜。有一天 tty偶然閱讀到一篇雜誌上的文章 陽光下的向日...

codeVS第二次月賽 C

題目描述 description 切記不要加任何檔案讀寫,本次比賽暫不支援ifndef online judge。請互相轉告。評測機是linux jijijie是恐怖的科學怪人,他有特殊的 科技 song ci crash。dash在他的家庭農場裡擁有 n塊連續的擁有者黑色和金色混雜的 da shg...

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

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