समस्या विवरण
मान लीजिए हम एक फोन डायरेक्टरी डिजाइन करना चाहते हैं जो निम्नलिखित ऑपरेशनों का समर्थन करता है:
- get - एक ऐसी संख्या प्रदान करेगा जो किसी को आवंटित नहीं है
- check - जांच करेगा कि कोई संख्या उपलब्ध है या नहीं
- release - एक संख्या को रीसायकल या रिलीज करेगा
इनिशियलाइज़र का उपयोग करके, हम पहले n संख्याओं को इनिशियलाइज़ कर सकते हैं।
समाधान दृष्टिकोण
एक सेट और कतार का उपयोग करके कुशल कार्यान्वयन:
- एक सेट (s) परिभाषित करें - आवंटित संख्याओं को ट्रैक करने के लिए
- एक कतार (available) परिभाषित करें - उपलब्ध संख्याओं को स्टोर करने के लिए
- इनिशियलाइज़र maxNumbers लेगा
- N := maxNumbers
- 0 से N-1 तक सभी संख्याओं को available कतार में डालें
- get() फ़ंक्शन:
- यदि available खाली है, तो -1 लौटाएं
- x := available का पहला तत्व
- x को s में डालें
- available से हटाएं
- x लौटाएं
- check(number) फ़ंक्शन:
- यदि number >= N या number < 0, तो false लौटाएं
- true लौटाएं यदि number s में नहीं है
- release(number) फ़ंक्शन:
- यदि check(number) true है, तो लौट जाएं (पहले से उपलब्ध)
- x := number
- x को s से हटाएं
- x को available में डालें
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;
cout << (ob.get()) << endl;
cout << (ob.check(2)) << endl;
cout << (ob.get()) << endl;
cout << (ob.check(2)) << endl;
ob.release(2);
cout << (ob.check(2)) << endl;
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