মান লেযিয়ে একটি রান-লেংথ এনকোডেড সিকোয়েন্সের মাধ্যমে ইটারেট করার জন্য একটি ইটেরেটর তৈরি করতে হবে। ইটেরেটরটি RLEIterator(int[] A) কল করে ইনিশিয়ালাইজ করা হয়, যেখানে A একটি সিকোয়েন্সের রান-লেংথ এনকোডিং। অর্থাৎ সব জোড় i-এর জন্য, A[i] বলে A[i+1] মানটি সিকোয়েন্সে কতবার রিপিট হয়েছে। ইটেরেটর একটি ফাংশন সাপোর্ট করে -
next(int n): এই ফাংশন পরবর্তী nটি এলিমেন্ট (n >= 1) এক্সহাস্ট করবে এবং এইভাবে এক্সহাস্ট করা শেষ এলিমেন্টটি রিটার্ন করবে। যদি এক্সহাস্ট করার জন্য কোনো এলিমেন্ট না থাকে, -1 রিটার্ন করবে।
A = [3,8,0,9,2,5] দিয়ে শুরু করলে, এটি [8,8,8,5,5] সিকোয়েন্সের এনকোডিং। "তিনটি ৮, শূন্য ৯, দুটি ৫"। A দিয়ে ইনিশিয়ালাইজ করার পর next(2), next(1), next(1), next(2) কল করলে ফলাফল [8, 8, 5, -1]।
এটি সমাধান করার জন্য আমরা নিচের ধাপগুলো অনুসরণ করব -
ইনিশিয়ালাইজারে অ্যারে A এবং index := 0 সেট করুন
next() মেথড n ইনপুট নেবে, এটি নিচের মতো কাজ করবে -
যখন index < A.size() এবং n > A[index]
n := n - A[index], index := index + 2
যদি index >= A.size() হয়, -1 রিটার্ন করুন
A[index] := A[index] - n
A[index + 1] রিটার্ন করুন
নিচের বাস্তবায়নটি দেখে আরও ভালো বুঝতে পারবেন -
উদাহরণ
#include <bits/stdc++.h> using namespace std; class RLEIterator { public: vector <int> A; int idx = 0; RLEIterator(vector<int>& A) { this->A = A; idx = 0; } int next(int n) { while(idx < A.size() && n > A[idx]){ n -= A[idx]; idx += 2; } if(idx >= A.size()) return -1; A[idx] = A[idx] - n; return A[idx + 1]; } }; main(){ vector<int> v = {3,8,0,9,2,5}; RLEIterator ob(v); cout << (ob.next(2)) << endl; cout << (ob.next(1)) << endl; cout << (ob.next(1)) << endl; cout << (ob.next(2)) << endl; }ইনপুট
Initialize with [3,8,0,9,2,5] and call next(2), next(1), next(1), next(2)
আউটপুট
8 8 5 -1