สมมติว่าเรามีเส้นทางแบบสัมบูรณ์สำหรับไฟล์ (เช่นระบบไฟล์ Unix) เราต้องลดรูปมันให้อยู่ในรูปแบบมาตรฐาน (canonical path) ในระบบไฟล์แบบ UNIX จุด '.' หมายถึงไดเรกทอรีปัจจุบัน และจุดสองจุด '..' จะย้ายขึ้นไปยังไดเรกทอรีผู้ปกครอง (parent directory) คุณสมบัติของ canonical paths มีดังนี้:
- เส้นทางต้องขึ้นต้นด้วยเครื่องหมาย '/' เสมอ
- ต้องมี '/' เพียงตัวเดียวระหว่างชื่อไดเรกทอรีสองชื่อ
- ชื่อไดเรกทอรีสุดท้าย (ถ้ามี) ต้องไม่ลงท้ายด้วย '/'
- Canonical path ต้องเป็นสตริงที่สั้นที่สุดที่แสดงเส้นทางสัมบูรณ์
เช่น ถ้าเส้นทางที่ให้มาคือ "/home/", "/../" และ "/home//user/" เส้นทางที่แปลงแล้วจะเป็น "/home", "/" และ "/home/user" ตามลำดับ
ขั้นตอนการทำงาน
- สร้างลิสต์
stและใส่ '/' ลงไป - แยกเส้นทางที่ให้มาด้วยตัวคั่น '/' เก็บไว้ในลิสต์
a - วนลูปผ่านแต่ละองค์ประกอบ
iในa:- ถ้า
iเป็น '..' (จุดสองจุด):- ถ้าความยาวของ
st> 1 ให้ลบองค์ประกอบสุดท้ายออกจากstมิฉะนั้นให้ข้ามไป
- ถ้าความยาวของ
- ถ้า
iเป็น '.' (จุดเดี่ยว) ให้ข้ามไป - ถ้า
iไม่ใช่สตริงว่าง ให้เพิ่ม '/' ต่อกับiลงในst
- ถ้า
- ถ้า
stมีเพียงองค์ประกอบเดียว ให้คืนค่า '/' - คืนค่าจากการรวมองค์ประกอบทั้งหมดใน
st
ตัวอย่างโค้ด
class Solution:
def simplifyPath(self, a):
st = ['/']
a = a.split("/")
for i in a:
if i == '..':
if len(st) > 1:
st.pop()
else:
continue
elif i == '.':
continue
elif i != '':
st.append("/" + str(i))
if len(st) == 1:
return "/"
return "".join(st[1:])
ob1 = Solution()
print(ob1.simplifyPath("/home/"))
print(ob1.simplifyPath("/../"))
print(ob1.simplifyPath("/home//user/"))
อินพุต
"/home/" "/../" "/home//user/"
เอาต์พุต
/home / /home/user