[簡單-933.最近的請求次數]
阿新 • • 發佈:2020-09-20
[簡單-933.最近的請求次數]
寫一個 RecentCounter 類來計算最近的請求。
它只有一個方法:ping(int t),其中 t 代表以毫秒為單位的某個時間。
返回從 3000 毫秒前到現在的 ping 數。
任何處於 [t - 3000, t] 時間範圍之內的 ping 都將會被計算在內,包括當前(指 t 時刻)的 ping。
保證每次對 ping 的呼叫都使用比之前更大的 t 值。
示例:
輸入:inputs = ["RecentCounter","ping","ping","ping","ping"], inputs = [[],[1],[100],[3001],[3002]] 輸出:[null,1,2,3,3]
題目分析:第一次讀到這個題根本不知道說的是什麼意思,看了別人的分析才知道:
題目是說計算3000毫秒前到現在的呼叫次數, 對於輸入1來說, [-2999, 1] 注意兩邊是閉區間 只有1這個時刻呼叫了一次,所以輸出1;輸入100以後呢,區間變成[-2900, 100], 這時候,1是包含在內的(-2900...1...100),因為在這個區間裡,呼叫了兩次, 輸出2;輸入3001呢,區間變成[1, 3001], 這時候包含在區間裡的有幾個呢? (1...100...3001),輸出3;輸入3002呢,區間變成[2, 3002], 這時候包含在區間裡的只有(100...3001...3002),因此還是3。
方法1:使用佇列對每次ping進行儲存,因為每次的結果依賴上次的結果。
class RecentCounter { public: queue<int>qe; public: RecentCounter() { } int ping(int t) { qe.push(t); while(!qe.empty()) { if (qe.front() < t- 3000) { qe.pop(); } else { break; } } return qe.size(); } }; /** * Your RecentCounter object will be instantiated and called as such: * RecentCounter* obj = new RecentCounter(); * int param_1 = obj->ping(t); */