একটি ফোন ডিরেক্টরি ডিজাইন করতে হবে যা নিচের অপারেশনগুলো সমর্থন করে:
- get() - কোনো নম্বর দিন যেটি কারো কাছে অ্যাসাইন করা নেই।
- check(number) - একটি নম্বর উপলব্ধ কিনা তা চেক করুন।
- release(number) - একটি নম্বর রিসাইকেল বা রিলিজ করুন।
ইনিশিয়ালাইজার দিয়ে প্রথমে n সংখ্যক নম্বর инициалиজ করা যাবে।
সমাধানের পদ্ধতি
- একটি সেট
s(ব্যবহৃত নম্বরগুলো রাখার জন্য) এবং একটি কিউavailable(উপলব্ধ নম্বরগুলো রাখার জন্য) ঘোষণা করুন। - কন্সট্রাক্টরে
maxNumbersপ্যারামিটার নিয়ে ০ থেকেmaxNumbers-1পর্যন্ত সব নম্বরavailableকিউতে পুশ করুন। - get():
- যদি
availableখালি হয়, তবে-1রিটার্ন করুন। - কিউ থেকে ফ্রন্ট নম্বর নিন, সেটে যোগ করুন, কিউ থেকে পপ করুন এবং রিটার্ন করুন।
- যদি
- check(number):
- যদি নম্বর অপ্রাসঙ্গিক হয় (নেগেটিভ বা >= N), তবে
falseরিটার্ন করুন। - নম্বর সেটে নেই কিনা তা চেক করে রিটার্ন করুন।
- যদি নম্বর অপ্রাসঙ্গিক হয় (নেগেটিভ বা >= N), তবে
- release(number):
- যদি নম্বর ইতিমধ্যে উপলব্ধ থাকে (
check(number) == true), তবে কিছু করবেন না। - নম্বর সেট থেকে মুছে কিউতে পুশ করুন।
- যদি নম্বর ইতিমধ্যে উপলব্ধ থাকে (
C++ কোড উদাহরণ
#include <bits/stdc++.h>
using namespace std;
class PhoneDirectory {
public:
set<int> s;
queue<int> available;
int N;
PhoneDirectory(int maxNumbers) {
N = maxNumbers;
for (int i = 0; i < N; i++)
available.push(i);
}
int get() {
if (available.size() == 0) return -1;
int x = available.front();
s.insert(x);
available.pop();
return x;
}
bool check(int number) {
if (number >= N || number < 0) return false;
return s.find(number) == s.end();
}
void release(int number) {
if (check(number)) return;
int x = number;
s.erase(x);
available.push(x);
}
};
int main() {
PhoneDirectory ob(3);
cout << (ob.get()) << endl; // 0
cout << (ob.get()) << endl; // 1
cout << (ob.check(2)) << endl; // 1 (true)
cout << (ob.get()) << endl; // 2
cout << (ob.check(2)) << endl; // 0 (false)
ob.release(2);
cout << (ob.check(2)) << endl; // 1 (true)
return 0;
}
ইনপুট
ob.get(); ob.get(); ob.check(2); ob.get(); ob.check(2); ob.release(2); ob.check(2);
আউটপুট
0 1 1 2 0 1