สมมติว่ามีอาร์เรย์ 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