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

โปรแกรมสร้างคลาสอิเทอเรเตอร์ถอดรหัส Run-Length ใน Python

สมมติว่าเราต้องการสร้างคลาสอิเทอเรเตอร์ที่รับสตริงที่เข้ารหัสแบบ Run-Length (RLE) เช่น s คลาสนี้มีเมธอดสองเมธอด:

  • next() - คืนค่าองค์ประกอบถัดไปในอิเทอเรเตอร์
  • hasnext() - ตรวจสอบว่ามีองค์ประกอบถัดไปหรือไม่

เช่น ถ้าอินพุตคือ s = "2b1a" แล้วสร้างอ็อบเจกต์ แล้วเรียก next(), hasnext(), next(), next(), hasnext() ผลลัพธ์จะเป็น "b", True, "b", "a", False

ขั้นตอนการแก้ปัญหา

  1. กำหนด Constructor รับพารามิเตอร์ s
  2. สร้างลิสต์ output และตัวแปร num เป็นสตริงว่าง
  3. วนลูปผ่านแต่ละตัวอักษร i ใน s:
    • ถ้า i เป็นตัวอักษร ให้แปลง num เป็นจำนวนเต็มเพิ่มใน output ตามด้วย i แล้วรีเซ็ต num
    • มิฉะนั้น (เป็นตัวเลข) ให้ต่อ i เข้า num
  4. เมธอด next():
    • ถ้า hasnext() คืน True ให้ดึง count และ letter จาก output
    • ลด count ลง 1 ถ้ายัง > 0 อัปเดต output[0] มิฉะนั้นตัด 2 ตัวแรกออก
    • คืนค่า letter
  5. เมธอด hasnext() คืน True ถ้า output ไม่ว่าง มิฉะนั้น False

ตัวอย่างโค้ด

class RunLengthIterator:
    def __init__(self, s):
        self.output = []
        num = ""
        for i in s:
            if i.isalpha():
                self.output.append(int(num))
                self.output.append(i)
                num = ""
            else:
                num += i

    def next(self):
        if self.hasnext():
            count = self.output[0]
            letter = self.output[1]
            count -= 1
            if count > 0:
                self.output[0] -= 1
            else:
                self.output = self.output[2:]
            return letter

    def hasnext(self):
        if len(self.output) != 0:
            return True
        return False

s = "2b1a"
obj = RunLengthIterator(s)
print(obj.next())
print(obj.hasnext())
print(obj.next())
print(obj.next())
print(obj.hasnext())

อินพุต

"2b1a" obj = RunLengthIterator(s) obj.next() obj.hasnext() obj.next() obj.next() obj.hasnext()

เอาต์พุต

b True b a False