สมมติว่าเราต้องการออกแบบตัวนับจำนวนการโจมตีที่นับจำนวนครั้งที่ได้รับในช่วง 5 นาทีที่ผ่านมา จะมีฟังก์ชันและยอมรับพารามิเตอร์การประทับเวลาในหน่วยที่สอง และเราอาจถือว่ามีการเรียกไปยังระบบตามลำดับเวลา (ดังนั้น การประทับเวลาจึงเพิ่มขึ้นอย่างซ้ำซากจำเจ) เรายังถือว่าการประทับเวลาที่เร็วที่สุดเริ่มต้นที่ 1
เป็นไปได้ที่การตีหลายครั้งจะมาถึงพร้อมกันอย่างคร่าวๆ
ดังนั้นเราจะเรียกฟังก์ชัน hit() เพื่อตี และฟังก์ชัน getHits() เพื่อรับจำนวนครั้งของการโจมตี
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดเวลาอาร์เรย์ขนาด 300
-
กำหนดอาร์เรย์ขนาด 300
-
กำหนดฟังก์ชัน hit() ซึ่งจะใช้เวลาประทับ
-
idx :=ตัวดัดแปลงประทับเวลา 300
-
หาก time[idx] ไม่เท่ากับการประทับเวลา −
-
เวลา[idx] :=การประทับเวลา
-
hits[idx] :=1
-
-
มิฉะนั้น
-
hits[idx] :=hits[idx] + 1
-
-
กำหนดฟังก์ชัน getHits() ซึ่งจะใช้เวลาประทับ
-
ยกเลิก :=0
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <300 อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
ถ้าประทับเวลา - time[i] <300 แล้ว −
-
ret :=ret + hits[i]
-
-
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class HitCounter { public: vector<int< time; vector<int< hits; HitCounter(){ time = vector<int<(300); hits = vector<int<(300); } void hit(int timestamp){ int idx = timestamp % 300; if (time[idx] != timestamp) { time[idx] = timestamp; hits[idx] = 1; } else { hits[idx] += 1; } } int getHits(int timestamp){ int ret = 0; for (int i = 0; i < 300; i++) { if (timestamp - time[i] < 300) { ret += hits[i]; } } return ret; } }; main(){ HitCounter ob; ob.hit(1); ob.hit(2); ob.hit(3); cout << (ob.getHits(4)) << endl; ob.hit(300); cout << (ob.getHits(300)) << endl; cout << (ob.getHits(301)); }
อินพุต
ob.hit(1); ob.hit(2); ob.hit(3); ob.getHits(4); ob.hit(300); ob.getHits(300); ob.getHits(301);
ผลลัพธ์
3 4 3