Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Triển khai lớp iterator giải mã chuỗi run-length trong Python

Chúng ta muốn định nghĩa một lớp iterator được khởi tạo với một chuỗi đã nén theo run-length (ví dụ: "2b1a" nghĩa là b lặp 2 lần, a lặp 1 lần). Lớp này cung cấp hai phương thức:

  • next(): trả về phần tử tiếp theo trong iterator.
  • hasnext(): kiểm tra xem còn phần tử tiếp theo hay không.

Ví dụ: với s = "2b1a", lần lượt gọi next(), hasnext(), next(), next(), hasnext() sẽ cho kết quả: "b", True, "b", "a", False.

Thuật toán

  1. Khởi tạo (__init__):
    • Tạo danh sách output rỗng.
    • Duyệt qua chuỗi s: nếu ký tự là chữ cái, chuyển số trước đó thành int và thêm cặp (số_lượng, ký_tự) vào output; nếu là số, gộp vào chuỗi số hiện tại.
  2. next():
    • Nếu hasnext() trả về True: lấy cặp đầu tiên (count, letter).
    • Giảm count đi 1. Nếu count > 0, cập nhật lại; nếu count == 0, bỏ cặp đó khỏi output.
    • Trả về letter.
  3. hasnext(): trả về True nếu output không rỗng.

Mã Python

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

    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):
        return len(self.output) != 0

s = "2b1a"
obj = RunLengthIterator(s)
print(obj.next())      # b
print(obj.hasnext())   # True
print(obj.next())      # b
print(obj.next())      # a
print(obj.hasnext())   # False

Đầu vào / Đầu ra

Input: "2b1a" + chuỗi gọi phương thức

Output: b True b a False