สมมติว่าเราต้องการสร้างคลาสอิเทอเรเตอร์ที่รับสตริงที่เข้ารหัสแบบ Run-Length (RLE) เช่น s คลาสนี้มีเมธอดสองเมธอด:
next()- คืนค่าองค์ประกอบถัดไปในอิเทอเรเตอร์hasnext()- ตรวจสอบว่ามีองค์ประกอบถัดไปหรือไม่
เช่น ถ้าอินพุตคือ s = "2b1a" แล้วสร้างอ็อบเจกต์ แล้วเรียก next(), hasnext(), next(), next(), hasnext() ผลลัพธ์จะเป็น "b", True, "b", "a", False
ขั้นตอนการแก้ปัญหา
- กำหนด Constructor รับพารามิเตอร์
s - สร้างลิสต์
outputและตัวแปรnumเป็นสตริงว่าง - วนลูปผ่านแต่ละตัวอักษร
iในs:- ถ้า
iเป็นตัวอักษร ให้แปลงnumเป็นจำนวนเต็มเพิ่มในoutputตามด้วยiแล้วรีเซ็ตnum - มิฉะนั้น (เป็นตัวเลข) ให้ต่อ
iเข้าnum
- ถ้า
- เมธอด
next():- ถ้า
hasnext()คืนTrueให้ดึงcountและletterจากoutput - ลด
countลง 1 ถ้ายัง > 0 อัปเดตoutput[0]มิฉะนั้นตัด 2 ตัวแรกออก - คืนค่า
letter
- ถ้า
- เมธอด
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