Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में जिगजैग इटरेटर - दो सरणियों को बारी-बारी से पुनरावृत्त करें


समस्या विवरण

मान लीजिए दो 1D सरणियां हैं, हमें एक इटरेटर लागू करना है जो उनके तत्वों को बारी-बारी से लौटाएगा। दो विधियां होंगी:

  • next() - अगला तत्व प्राप्त करने के लिए
  • hasNext() - जांचने के लिए कि अगला तत्व मौजूद है या नहीं

उदाहरण के लिए, यदि इनपुट v1 = [1,2], v2 = [3,4,5,6] है, तो आउटपुट [1,3,2,4,5,6] होगा।

समाधान दृष्टिकोण

कतार का उपयोग करके दो सरणियों के सूचकांकों को ट्रैक करें:

  1. पेयर्स की कतार q परिभाषित करें
  2. इनिशियलाइज़र दो सरणियों v1 और v2 लेता है:
    • यदि v1 का आकार > 0, तो {0, 0} को q में डालें
    • यदि v2 का आकार > 0, तो {0, 1} को q में डालें
  3. next() फ़ंक्शन:
    • temp := q का पहला तत्व, q से हटाएं
    • ret := 0
    • यदि temp.second == 1:
      • ret := v2[temp.first]
      • temp.first बढ़ाएं
      • यदि temp.first < v2 का आकार, तो temp को q में डालें
    • अन्यथा:
      • ret := v1[temp.first]
      • temp.first बढ़ाएं
      • यदि temp.first < v1 का आकार, तो temp को q में डालें
    • ret लौटाएं
  4. hasNext() फ़ंक्शन:
    • true लौटाएं जब q खाली न हो

C++ कार्यान्वयन

#include <bits/stdc++.h> 
using namespace std; 

class ZigzagIterator { 
public: 
    queue <pair<int, int>> q; 
    vector <int> v1, v2; 
    
    ZigzagIterator(vector<int>& v1, vector<int>& v2) { 
        this->v1 = v1; 
        this->v2 = v2; 
        if (v1.size()) { 
            q.push({ 0, 0 }); 
        } 
        if (v2.size()) { 
            q.push({ 0, 1 }); 
        } 
    } 
    
    int next() { 
        pair<int, int> temp; 
        temp = q.front(); 
        q.pop(); 
        int ret = 0; 
        if (temp.second == 1) { 
            ret = v2[temp.first]; 
            temp.first++; 
            if (temp.first < v2.size()) 
                q.push(temp); 
        } 
        else { 
            ret = v1[temp.first]; 
            temp.first++; 
            if (temp.first < v1.size()) 
                q.push(temp); 
        } 
        return ret; 
    } 
    
    bool hasNext() { 
        return !q.empty(); 
    } 
}; 

int main(){ 
    vector<int> v1 = {1,3,5,7}, v2 = {2,4,6,8,10,12,17}; 
    ZigzagIterator ob(v1, v2); 
    cout << (ob.next()) << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.hasNext() ? "True" : "False") << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.hasNext() ? "True" : "False") << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.hasNext() ? "True" : "False") << endl; 
    return 0;
}

इनपुट

{1,3,5,7},{2,4,6,8,10,12,17}

आउटपुट

1 2 True 3 4 5 True 6 7 8 10 True 12 17 False
  1. - C++ में अमान्य लेनदेन

    मान लीजिए कुछ लेनदेन हैं। एक लेनदेन संभवतः अमान्य है यदि:राशि $1000 से अधिक है, या;यदि यह 60 मिनट के भीतर (सम्मिलित) किसी अन्य लेनदेन से होता है जिसका नाम समान है लेकिन शहर अलग है।यहां प्रत्येक लेनदेन स्ट्रिंग transactions[i] में कॉमा से अलग मान होते हैं जो नाम, समय (मिनट में), राशि, और लेनदेन के शह

  1. C++ में मैट्रिक्स का जिगजैग (या विकर्ण) ट्रैवर्सल C++ में मैट्रिक्स का जिगजैग (या विकर्ण) ट्रैवर्सल

    इस समस्या में, हमें एक 2D मैट्रिक्स दिया गया है। हमारा कार्य मैट्रिक्स के सभी तत्वों को विकर्ण क्रम में प्रिंट करना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, 1 2 3 4 5 6 7 8 9 आउटपुट - 1 4 2 7 5 3 8 6 9 आइए उस पैटर्न को देखें जो मैट्रिक्स को जिगजैग या विकर्ण रूप में प्रिंट

  1. C++ में जिगजैग ट्री ट्रैवर्सल C++ में जिगजैग ट्री ट्रैवर्सल

    इस समस्या में, हमें एक बाइनरी ट्री दिया गया है। हमारा कार्य बाइनरी ट्री को जिगजैग रूप में प्रिंट करना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, उपरोक्त बाइनरी ट्री का जिगजैग ट्रैवर्सल है 3 5 1 8 7 0 4 इस समस्या को हल करने के लिए, हमें बाइनरी ट्री को लेवल दर लेवल ट्रैवर्स करना होगा