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. 結語
這題沒解出來,主要是英文太卡了,沒看懂題目。