สมมติว่าเรามีคิวของจำนวนเต็ม เราจำเป็นต้องดึงจำนวนเต็มเฉพาะตัวแรกในคิวนั้น เราต้องใช้คลาสที่ชื่อว่า FirstUnique:มันจะถูกเริ่มต้นโดยตัวเลขในคิว กำหนดหนึ่งฟังก์ชัน showFirstUnique() ซึ่งจะคืนค่าของจำนวนเต็มเฉพาะตัวแรกของคิวและคืนค่า -1 หากไม่มีจำนวนเต็มดังกล่าว อีกวิธีหนึ่งคือ add(value) ซึ่งจะแทรกค่าลงในคิว
ดังนั้นหากอินพุตเป็นแบบ
-
เริ่มต้นด้วย [2,3,4] จากนั้นเรียกใช้ฟังก์ชันดังต่อไปนี้ −
-
showFirstUnique()
-
เพิ่ม(5)
-
showFirstUnique()
-
เพิ่ม(2)
-
showFirstUnique()
-
เพิ่ม(3)
-
showFirstUnique(),
จากนั้นผลลัพธ์จะเป็น 2, 2, 3, -1 ตามลำดับ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งคิว q
-
กำหนดหนึ่งแผนที่ cnt
-
ตัวเริ่มต้นจะใช้อาร์เรย์
-
สำหรับแต่ละองค์ประกอบ i เป็น nums
-
(เพิ่ม cnt[i] ขึ้น 1)
-
-
สำหรับแต่ละองค์ประกอบ i เป็น nums
-
ถ้า cnt[i] เหมือนกับ 1 แล้ว −
-
แทรก i ลงใน q
-
-
-
-
กำหนดฟังก์ชัน showFirstUnique()
-
ในขณะที่ (ไม่ใช่ q ว่างเปล่าและ cnt[องค์ประกอบแรกของ q]> 1) ทำ -
-
ลบองค์ประกอบออกจาก q
-
-
return (ถ้า q ว่างเปล่า ดังนั้น -1 มิฉะนั้นองค์ประกอบแรกของ q)
-
กำหนดฟังก์ชัน add() ซึ่งจะใช้ค่า
-
(เพิ่มค่า cnt[ค่า] ขึ้น 1)
-
ถ้า cnt[value] เหมือนกับ 1 แล้ว −
-
ใส่ค่าลงใน q
-
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#includeใช้เนมสเปซ std;คลาส FirstUnique {สาธารณะ:คิว q; แผนที่ cnt; FirstUnique(vector &nums) { สำหรับ (int i :nums) { cnt[i]++; } สำหรับ (int i :nums) { if (cnt[i] ==1) { q.push(i); } } } int showFirstUnique() { while (!q.empty() &&cnt[q.front()]> 1) q.pop(); ส่งคืน q.empty() ? -1 :q.front(); } เพิ่มเป็นโมฆะ (ค่า int) { cnt[value]++; ถ้า (cnt[value] ==1) q.push(value); }};main(){ vector v ={2,3,5}; FirstUnique ob(v); ศาล <<(ob.showFirstUnique()) < อินพุต
<ก่อน>{2,3,5}ob.showFirstUnique();ob.add(5);ob.showFirstUnique();ob.add(2);ob.showFirstUnique();ob.add(3);ob .showFirstUnique();
ผลลัพธ์
223-1