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
- Khởi tạo (
__init__):- Tạo danh sách
outputrỗng. - Duyệt qua chuỗi
s: nếu ký tự là chữ cái, chuyển số trước đó thànhintvà thêm cặp(số_lượng, ký_tự)vàooutput; nếu là số, gộp vào chuỗi số hiện tại.
- Tạo danh sách
next():- Nếu
hasnext()trả vềTrue: lấy cặp đầu tiên(count, letter). - Giảm
countđi 1. Nếucount > 0, cập nhật lại; nếucount == 0, bỏ cặp đó khỏioutput. - Trả về
letter.
- Nếu
hasnext(): trả vềTruenếuoutputkhô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