Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Zigzag Iterator ใน C++


สมมติว่ามีอาร์เรย์ 1 มิติสองอัน เราต้อง implement iterator ที่จะคืนค่าสมาชิกสลับกัน มีเมธอดสองตัว −

  • next() − เพื่อดึงสมาชิกถัดไป

  • hasNext() − เพื่อตรวจสอบว่ามีสมาชิกถัดไปหรือไม่

เช่น ถ้าอินพุทเป็น v1 = [1,2] v2 = [3,4,5,6] ผลลัพธ์จะเป็น [1,3,2,4,5,6]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนดังนี้ −

  • กำหนดคิว q ของ pairs

  • จาก initializer รับอาร์เรย์ v1 และ v2

  • ถ้าขนาดของ v1 แล้ว −

    • แทรก { 0, 0 } ลงใน q

  • ถ้าขนาดของ v2 แล้ว −

    • แทรก { 0, 1 } ลงใน q

  • กำหนด pair temp

  • temp := สมาชิกแรกของ q

  • ลบสมาชิกออกจาก q

  • ret := 0

  • ถ้า temp.second เท่ากับ 1 แล้ว −

    • ret := v2[temp.first]

    • เพิ่ม temp.first ขึ้น 1

    • ถ้า temp.first < ขนาดของ v2 แล้ว −

      • แทรก temp ลงใน q

  • มิฉะนั้น

    • ret := v1[temp.first]

    • เพิ่ม temp.first ขึ้น 1

    • ถ้า temp.first < ขนาดของ v1 แล้ว −

      • แทรก temp ลงใน q

  • คืนค่า ret

  • กำหนดฟังก์ชัน hasNext()

  • คืนค่า true เมื่อ q ไม่ว่าง

ตัวอย่าง

ลองดูการติดตั้งต่อไปนี้เพื่อให้เข้าใจได้ดีขึ้น −

#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();    } }; 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;    cout << (ob.next()) << endl;    cout << (ob.next()) << endl;    cout << (ob.hasNext() ? "True" : "False") << endl; }

อินพุท

{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