python實現 CCF201604 3 路徑解析

2021-09-12 16:29:02 字數 3376 閱讀 8235

試題編號:

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

1.讀取當前路徑:並用'/'進行分割字串,然後刪除裡面的空字元

2.讀取需要正規化操作的字串,分三種情況

(1)空字元:正規化後當前路徑

(2)絕對路徑:用'/'進行分割字串,然後刪除裡面的空字元,並且檢查".."以及"."的情況

(3)相對路徑:現將相對路徑分割,然後刪除空字元,然後將當前路徑和其合併

4.『.』處理方法:刪除當前字串

from copy import deepcopy

def delnull(file): # 刪除列表中的空字元

length = len(file)

i = 0

while i < length:

if file[i] == '':

file.pop(i)

length -= 1

else:

i += 1

return file

p = int(input())

current = input().split('/') # 當前路徑

current = delnull(current)

result =

for i in range(p):

temp = input()

if temp == '': # 空字元

temp = deepcopy(current)

elif temp[0] == '/': # 絕對路徑

temp = delnull(temp.split('/'))

else: # 相對路徑

cur = deepcopy(current)

temp = delnull(temp.split('/'))

cur.extend(temp) # 注意這裡將當前路徑和相對路徑合併,當前路徑在前面

temp = deepcopy(cur)

# 處理'.'和'..'的情況

index = 0

length = len(temp)

while index < length:

if temp[index] == '.':

temp.pop(index)

length -= 1

elif temp[index] == '..':

temp.pop(index)

if index == 0: # 已經返回根目錄

length -= 1

else:

index = index - 1

temp.pop(index)

length -= 2

else:

index += 1

for ele in result:

print("/"+"/".join(ele))

ccf小球碰撞Python實現

輸入的第一行包含三個整數n,l,t,用空格分隔,分別表示小球的個數 線段長度和你需要計算t秒之後小球的位置。第二行包含n個整數a1,a2,an,用空格分隔,表示初始時刻n個小球的位置。輸出一行包含n個整數,用空格分隔,第i個整數代表初始時刻位於ai的小球,在t秒之後的位置。樣例輸入 3 10 5 4...

CCF 遊戲(Python實現 100分)

目錄前言 一 問題描述 二 問題分析 三 程式說明 最近我在做ccf的題目,也打算把每道題的解題思路都寫到部落格上來,希望能幫助到也在做ccf題目的讀者們,希望你們通過本文能有所提示,幫助大家提公升程式設計能力。另外有個很好的想法就是,建議讀者們可以先看一下問題分析的部分,然後自己再整理一下思路,重...

python實現 CCF201709 5 除法

試題編號 201709 5 試題名稱 除法時間限制 10.0s 記憶體限制 256.0mb 問題描述 問題描述 小蔥喜歡除法,所以他給了你n個數a1,a2,an,並且希望你執行m次操作,每次操作可能有以下兩種 給你三個數l,r,v,你需要將al,al 1,ar之間所有v的倍數除以v。給你兩個數l,r...