मान लीजिए हम एक इटरेटर क्लास परिभाषित करना चाहते हैं जो रन-लेंथ एन्कोडेड लोअरकेस स्ट्रिंग s से निर्मित होता है। इस इटरेटर के लिए दो फ़ंक्शन हैं:
- next() - इटरेटर में अगला एलिमेंट ढूंढता है
- hasnext() - जांचता है कि अगला एलिमेंट मौजूद है या नहीं
उदाहरण के लिए, यदि इनपुट s = "2b1a" है, तो इस s के साथ एक ऑब्जेक्ट बनाएं, फिर next(), hasnext(), next(), next(), hasnext() कॉल करें, तो आउटपुट होगा "b", True, "b", "a", False।
समाधान दृष्टिकोण
- एक कंस्ट्रक्टर परिभाषित करें जो s लेता है
- output := एक नई सूची
- num := खाली स्ट्रिंग
- s में प्रत्येक कैरेक्टर i के लिए:
- यदि i अल्फाबेटिक है, तो:
- output के अंत में num जोड़ें
- output के अंत में i जोड़ें
- num := खाली स्ट्रिंग
- अन्यथा:
- num := num + i
- यदि i अल्फाबेटिक है, तो:
- next() फ़ंक्शन परिभाषित करें:
- यदि hasnext() true है, तो:
- count := output[0]
- letter := output[1]
- count := count - 1
- यदि count > 0, तो output[0] := output[0] - 1
- अन्यथा, output := output[इंडेक्स 2 से अंत तक]
- letter लौटाएं
- यदि hasnext() true है, तो:
- hasnext() फ़ंक्शन परिभाषित करें:
- यदि output का आकार 0 नहीं है, तो True लौटाएं
- 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