1. 程式人生 > 實用技巧 >[簡單-933.最近的請求次數]

[簡單-933.最近的請求次數]

[簡單-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);
 */