雲栖号資訊:【 點選檢視更多行業資訊】
在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!
這題的難度是Medium,通過率是1/3左右,也是一道踩多捧少的題,一共有737個點贊,1703個反對。老實講我覺得反對得不冤,我先賣個關子,等會來詳細聊聊它為什麼會被踩。
題意
題目會給定一個字元串,表示一個Unix系統下的檔案路徑,這個路徑當中會包含一些路徑的計算, 要求我們傳回簡化之後的結果。
在Unix系統下用/來分隔檔案夾,比如/home/download/file.txt。在這個路徑當中支援簡單的運算,比如.表示目前檔案夾。是以如果我們目前終端在download這個檔案夾下,我們要通路file.txt檔案,可以使用相對路徑./file.txt即可。除此之外,還包括..操作。..表示目前檔案夾的上層檔案夾。
比如如果我們在download檔案夾下,當我們運作cd ..,那麼我們就會傳回到download檔案夾的上層,也就是home檔案夾下。我們是可以把..和.嵌入在檔案路徑中使用的。比如說/home/download/../download/file.txt也是合法的,中間由于我們嵌入了..是以會傳回到download的上層也就是home,然後再進入download。雖然這樣很費勁,但是是合法的。隻要你願意,可以不停地利用..回到上層,來回穿梭。
我們要傳回的是這個路徑簡化之後的版本也就是:/home/download/file.txt
我們來看幾個案例:
Input: "/home/"
Output: "/home"
Explanation: Note that there is no trailing slash after the last directory name.
Input: "/../"
Output: "/"
Explanation: Going one level up from the root directory is a no-op, as the root level is the highest level you can go.
Input: "/a/../../b/../c//.//"
Output: "/c"
題解
這題其實也是模拟題,不過相比之前我們做過的模拟題難度要小上很多。這道題的思路還是蠻明顯的,由于存在..和.的操作,我們需要記錄下來通路的路徑,在..向上移動的時候把之前的檔案夾抛棄掉。
舉個例子,a/b/../b/d/e
我們在b之後使用了..回到了a,然後我們再次進入b往下。顯然這裡由于..導緻b在路徑當中出現了兩次,這是多餘的。我們需要在..回到上層的時候把b抛棄掉。對于.操作來說,由于它就表示目前路徑,是以對于答案并不會影響,我們直接忽略它的存在即可。
了解了這個思路之後,實作是非常簡單的,我們隻需要根據/将字元串分段。每一段當中除了.和..之外就是檔案夾的名稱,我們用一個list去存儲從上到下的經過的檔案夾,遇見..就将最後一個添加的元素抛棄。最後用/将它們join在一起即可,唯一需要注意的是,當我們已經到了頂層的時候,如果我們繼續執行..并不會報錯,而是會停留在原地。是以我們需要特殊判斷這種情況,除此之外就幾乎沒有難度了。

代碼非常簡單,隻有10行左右。
總結
到這裡,關于題解的部分就結束了。
我們回到标題當中的問題,為什麼我會有這樣的感受呢?是因為這道題我做過兩次,上一次做的時候用的是C++。由于C++的string類型不支援split,是以我需要自己進行split處理。整個的計算過程要複雜得多,我放一下C++的AC代碼大家自己感受一下就知道了,簡直不是一個次元的。
我說這些的重點并不是吐槽C++這門語言有多麼落後,或者是證明Python有多麼強大。不同的語言有不同的誕生背景,也有不同的強項,這個是很自然的。這題最主要的問題是不應該出這種因為語言本身的特性帶來巨大差異的問題,在正規比賽當中出這樣的問題一定是會被瘋狂吐槽的。
舉個例子,比如Java當中有大整數類BigInter,可以用來代替高精度算法來處理超過int64範圍的大整數。如果有出題人出了一道非常複雜的大整數問題,那麼使用Java的選手使用BigInter(算法比賽一般不允許使用Python),三兩行代碼就可以輕松AC,而C++選手卻需要些上百行代碼來實作高精度計算,這顯然是不公平的。是以acm比賽當中,出題人一定會盡量避免這種語言特性差異巨大的問題,大概這也是這題遭黑的原因吧。
【雲栖号線上課堂】每天都有産品技術專家分享!
課程位址:
https://yqh.aliyun.com/live立即加入社群,與專家面對面,及時了解課程最新動态!
【雲栖号線上課堂 社群】
https://c.tb.cn/F3.Z8gvnK
原文釋出時間:2020-05-27
本文作者:承志
本文來自:“
掘金”,了解相關資訊可以關注“掘金”