Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ลดรูปเส้นทาง (Simplify Path) ใน Python

สมมติว่าเรามีเส้นทางแบบสัมบูรณ์สำหรับไฟล์ (เช่นระบบไฟล์ Unix) เราต้องลดรูปมันให้อยู่ในรูปแบบมาตรฐาน (canonical path) ในระบบไฟล์แบบ UNIX จุด '.' หมายถึงไดเรกทอรีปัจจุบัน และจุดสองจุด '..' จะย้ายขึ้นไปยังไดเรกทอรีผู้ปกครอง (parent directory) คุณสมบัติของ canonical paths มีดังนี้:

  • เส้นทางต้องขึ้นต้นด้วยเครื่องหมาย '/' เสมอ
  • ต้องมี '/' เพียงตัวเดียวระหว่างชื่อไดเรกทอรีสองชื่อ
  • ชื่อไดเรกทอรีสุดท้าย (ถ้ามี) ต้องไม่ลงท้ายด้วย '/'
  • Canonical path ต้องเป็นสตริงที่สั้นที่สุดที่แสดงเส้นทางสัมบูรณ์

เช่น ถ้าเส้นทางที่ให้มาคือ "/home/", "/../" และ "/home//user/" เส้นทางที่แปลงแล้วจะเป็น "/home", "/" และ "/home/user" ตามลำดับ

ขั้นตอนการทำงาน

  1. สร้างลิสต์ st และใส่ '/' ลงไป
  2. แยกเส้นทางที่ให้มาด้วยตัวคั่น '/' เก็บไว้ในลิสต์ a
  3. วนลูปผ่านแต่ละองค์ประกอบ i ใน a:
    • ถ้า i เป็น '..' (จุดสองจุด):
      • ถ้าความยาวของ st > 1 ให้ลบองค์ประกอบสุดท้ายออกจาก st มิฉะนั้นให้ข้ามไป
    • ถ้า i เป็น '.' (จุดเดี่ยว) ให้ข้ามไป
    • ถ้า i ไม่ใช่สตริงว่าง ให้เพิ่ม '/' ต่อกับ i ลงใน st
  4. ถ้า st มีเพียงองค์ประกอบเดียว ให้คืนค่า '/'
  5. คืนค่าจากการรวมองค์ประกอบทั้งหมดใน 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