close

01. 審題

完成 class RecentCounter 的函式 ping(int t),t 代表時間(毫秒),計算在 3000 毫秒內呼叫該函式的次數(包含最新一次的呼叫),簡而言之,回傳 [t - 3000, t] 這個時間區間內發生的所有呼叫次數。

保證每次呼叫 ping 的參數 t 嚴格大於上次呼叫時的 t。

每次呼叫會形成陣列中的元素。

限制:

1 ≦ t ≦ 10 ^ 9

每個測試資料呼叫 ping 滿足其參數 t 嚴格遞增。

最多有 10 ^ 4 次呼叫 ping。

範例測試資料:

Input

["RecentCounter", "ping", "ping", "ping", "ping"]

[[], [1], [100], [3001], [3002]]

Output

[null, 1, 2, 3, 3]

範例解釋:

RecentCounter recentCounter = new RecentCounter();

recentCounter.ping(1); // requests = [1], range is [-2999,1], return 1

recentCounter.ping(100); // requests = [1, 100], range is [-2900,100], return 2

recentCounter.ping(3001); // requests = [1, 100, 3001], range is [1,3001], return 3

recentCounter.ping(3002); // requests = [1, 100, 3001, 3002], range is [2,3002], return 3

02 解法1(Java)

每呼叫一次 ping(t) 都需從頭檢查陣列中的元素是否符合條件 [t - 3000, t]

class RecentCounter {
    List output;
    
    public RecentCounter() {
        output = new ArrayList ();
    }
    
    public int ping(int t) {
        output.add(t);
        int min = t - 3000;
        int count = 0;
        for (Integer num : output) {
            if (num >= min && num <= t) {
                count++;
            }
        }
        return count;
    }
}

03 解法2(Java)

每次都將不符條件的元素刪除,剩餘的數量極為所求。

class RecentCounter {
    List output;
    
    public RecentCounter() {
        output = new ArrayList ();
    }
    
    public int ping(int t) {
        output.add(t);
        int min = t - 3000;
        int i = 0, n = output.size();
        while (i < n && output.get(i) < min) {
            output.remove(output.get(i));
        }
        return output.size();
    }
}

04. 結語

這題沒解出來,主要是英文太卡了,沒看懂題目。

arrow
arrow
    文章標籤
    LeetCode
    全站熱搜

    紫漓雪 發表在 痞客邦 留言(0) 人氣()