একটি ২D ভেক্টর দেওয়া আছে। এটিকে ফ্ল্যাটেন (Flatten) করে একটি ইটারেটর ইমপ্লিমেন্ট করতে হবে যাতে সিকোয়েনশিয়ালি সব এলিমেন্ট এক্সেস করা যায়। দুটি মেথড থাকবে:
next() - বর্তমান এলিমেন্টের পরের এলিমেন্ট রিটার্ন করবে।hasNext() - পরবর্তী এলিমেন্ট আছে কিনা চেক করবে।
উদাহরণ
ইনপুট: [[1,2],[3],[4]]
ফাংশন কল সিকোয়েন্স:
next() → 1, next() → 2, next() → 3, hasNext() → true, hasNext() → true, next() → 4, hasNext() → false
আউটপুট সিকোয়েন্স: [1,2,3,true,true,4,false]
সমাধানের পদ্ধতি (Two Pointers: Row & Column)
- ২D ভেক্টর
v, রো পয়েন্টারrowPointer, কলাম পয়েন্টারcolPointer, মোট রোn। - কন্সট্রাক্টরে:
rowPointer = 0, colPointer = 0। খালি সারি স্কিপ করুন (while লুপ)। next():x = v[rowPointer][colPointer]।colPointer++।- যদি
colPointer == v[rowPointer].size()(সারি শেষ), তবে:colPointer = 0, rowPointer++।- খালি সারি স্কিপ করুন (while লুপ)।
xরিটার্ন করুন।
hasNext():rowPointer != nহলেtrue, অন্যথায়false।
C++ কোড উদাহরণ
#include <bits/stdc++.h>
using namespace std;
class Vector2D {
public:
int rowPointer, colPointer;
int n;
vector<vector<int>> v;
Vector2D(vector<vector<int>>& v) {
this->v = v;
rowPointer = 0;
colPointer = 0;
n = v.size();
while (rowPointer < n && colPointer >= v[rowPointer].size()) {
rowPointer++;
}
}
int next() {
int x = v[rowPointer][colPointer];
colPointer++;
if (colPointer == v[rowPointer].size()) {
colPointer = 0;
rowPointer++;
while (rowPointer < n && colPointer >= v[rowPointer].size()) {
rowPointer++;
}
}
return x;
}
bool hasNext() {
return !(rowPointer == n);
}
};
int main() {
vector<vector<int>> v = {{1,2},{3},{4}};
Vector2D ob(v);
cout << (ob.next()) << endl; // 1
cout << (ob.next()) << endl; // 2
cout << (ob.next()) << endl; // 3
cout << (ob.hasNext()) << endl; // 1 (true)
cout << (ob.next()) << endl; // 4
cout << (ob.hasNext()); // 0 (false)
return 0;
}
ইনপুট
ob.next() ob.next() ob.next() ob.hasNext() ob.next() ob.hasNext()
আউটপুট
1 2 3 1 4 0