สมมติว่ามีอาร์เรย์ 1D สองชุด เราต้องใช้ตัววนซ้ำเพื่อส่งคืนองค์ประกอบสลับกัน จะมีสองวิธี -
-
next() − เพื่อรับองค์ประกอบถัดไป
-
hasNext() - เพื่อตรวจสอบว่าองค์ประกอบถัดไปมีอยู่หรือไม่
ดังนั้นหากอินพุตเป็นเหมือน v1 =[1,2] v2 =[3,4,5,6] ผลลัพธ์จะเป็น [1,3,2,4,5,6]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งคิว q ของคู่
-
จากตัวเริ่มต้นใช้สองอาร์เรย์ v1 และ v2
-
ถ้าขนาด v1 แล้ว −
-
แทรก { 0, 0 } ลงใน q
-
-
ถ้าขนาดของ v2 แล้ว −
-
แทรก { 0, 1 } ลงใน q
-
-
กำหนดอุณหภูมิหนึ่งคู่
-
temp :=องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
ยกเลิก :=0
-
ถ้า temp.second เท่ากับ 1 แล้ว −
-
ret :=v2[temp.first]
-
(เพิ่ม temp.first โดย 1)
-
ถ้า temp.first <ขนาด v2 แล้ว −
-
ใส่อุณหภูมิลงใน q
-
-
-
มิฉะนั้น
-
ret :=v1[temp.first]
-
(เพิ่ม temp.first โดย 1)
-
ถ้า temp.first <ขนาด v1 แล้ว −
-
ใส่อุณหภูมิลงใน q
-
-
-
รีเทิร์น
-
กำหนดฟังก์ชัน hasNext()
-
คืนค่า จริง เมื่อ 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