有一段時間沒有寫ccf題了,今天花了一點時間自己寫了道題。花點時間來寫篇題解mark一下。
題目鏈結入下,相信能看到這個題解的人都應該很熟悉題目
這個題的題意大致如下:
給出一些表示路徑的字串,然後需要實現按一定規則將路徑正規化。
正如ccf大多數第三題的套路,按一定的規則做一些字串的處理,這題也不例外,那麼完成這個題需要注意以下幾點規則。
1.保證表達的路徑不變的情況下去掉.和…
這個實現的話,可以這麼理解,/./表示當前目錄,那麼只需要在字串裡面刪除.和/就可以。然後用string.find()找到/./的位置,然後刪除/.就能完成這一條
具體實現如下:
//去掉/./
int pos=0;
while
((pos=path.
find
("/./"))
!=-1)
2.去掉多餘的/
這個字元的話,需要去掉重複的/還需要去掉末尾的/。這一功能我在實現上有些臃腫,我的理解是從前往後逐個遍歷,遇到重複的/就刪除,遇到末尾的/也刪除,但是注意你需要排除一下特殊情況!!!就是「」這種情況!!!然後注意一下別越界就行了。具體實現如下:
for
(int i=
0;isize()
;i++
)//去掉多餘的斜槓
else
//如果沒有到結尾,那就檢查有沒有連續的/
i--;}
}}}
3.空字串表示著當前目錄,這裡有乙個很容易錯的地方!!!就是如果你是用cin讀入字串的那,cin是無法讀入空串的!!!所以需要用getline()
然後其他的問題不大。
4.關於絕對路徑還是相對路徑的問題!其實這裡大可不必去單獨處理相對路徑,雖然以上思路都是針對絕對路徑做的處理。因為,相對路徑加上當前目錄就是絕對路徑!!!所以這裡也可以統一起來.
okok!大致思路就是這樣以下上**!!!
#include
using
namespace std;
bool
is_root
(string path)
return
true;}
intmain
(void)if
(is_root
(path)
==true
)//讀的是乙個空字串或者只含有'/'則判定得到的是乙個根目錄
//判斷它是絕對路徑還是相對路徑
if(path[0]
=='/'
) path_type=1;
else
path_type=0;
if(path_type==1)
path=path;
else
path=current_path+
"/"+path;
for(
int i=
0;isize()
;i++
)//去掉多餘的斜槓
else
//如果沒有到結尾,那就檢查有沒有連續的/
i--;}
}}}//去掉/./
int pos=0;
while
((pos=path.
find
("/./"))
!=-1)
while
((pos=path.
find
("/../"))
!=-1)
} cout<}return0;
}
CCF路徑解析
問題描述 在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄 或者資料夾 和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案或其他目錄。同乙個目錄下的所有檔案和目錄的名字各不相同,不同目錄下可以有名字相同的檔案或目錄。為了指定檔案...
CCF 路徑解析
試題編號 201604 3 試題名稱 路徑解析 時間限制 1.0s 記憶體限制 256.0mb 問題描述 在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄 或者資料夾 和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案或其他目錄...
CCF 路徑解析
思路本題就是乙個簡單的字串操作的問題,具體分為以下情況 1.的形式代表的是當前目錄,所以之間刪除 即可,保留最後乙個 2.的形式代表的是上一級目錄,所以需要刪除 代表當前目錄,刪除即可回到上一級。3.連續多個 直接刪除留下乙個即可。4.最後乙個 直接刪除。本題有乙個點,就是用scanf輸入字串的話不...