寫一個 RecentCounter 類來計算特定時間范圍內最近的請求,實作 RecentCounter 類:
- RecentCounter() 初始化計數器,請求數為 0 ,
- int ping(int t) 在時間 t 添加一個新請求,其中 t 表示以毫秒為單位的某個時間,并回傳過去 3000 毫秒內發生的所有請求數(包括新請求),確切地說,回傳在 [t-3000, t]內發生的請求數, 保證 每次對 ping 的呼叫都使用比之前更大的 t 值,
來源:力扣(LeetCode)鏈接:https://leetcode-cn.com/problems/number-of-recent-calls
??最近的請求次數
- 1??佇列
- 2??題目分析
- 3??代碼實作
1??佇列
JavaScript中沒有佇列這個資料結構,但是可以用陣列來實作所有的功能,佇列是一個先進先出的資料結構,一般JavaScript中采用佇列的資料解決問題時會用到
- 入隊push()向陣列中添加元素
- 出隊shift()移除陣列中第一個元素
- queue(0) 取陣列的第一個元素
2??題目分析
🤔可能比較迷惑的就是示例的輸入輸出是陣列,但是給的代碼模板卻是一個建構式
🧠 題目的意思可以理解為:按照陣列的順序去呼叫ping方法,每次呼叫ping方法傳進去的t就是陣列中發起請求的時間,回傳的是一個陣列,存放最近時間內的請求次數
🧠換個說法通過呼叫建構式的prototype屬性的ping方法,將請求時間t作為引數傳入,回傳最近時間內的請求次數,
例如傳入陣列[1,3000,30001]ping方法的呼叫情況
- recentCounter.ping(1)就會回傳[-2999,1]之間的請求次數
- recentCounter.ping(3000)就會回傳[0,3000]之間的請求次數
- recentCounter.ping(3001)就會回傳[1,3001]之間的請求次數
🙋?♀?因為先發起的請求到時間后就會被剔除,先進先出所以考慮到可以使用佇列來做,求3000毫秒內的請求次數,分析一下大致思路應該是
- 有新請求就入隊
- 3000毫秒前的請求出隊
- 佇列的長度就是最近請求次數
🙊那首先肯定是先建一個佇列,這個佇列需要在ping方法中被訪問,
🙊而且多次呼叫時訪問的都是同一個佇列,所以佇列應該掛載在建構式的this上,這樣所有的類方法都能訪問到(包括ping)
💯ping方法中實作的就應該是發起請求時將其入隊,當不在時間范圍內時將之前的請求踢出隊,最后回傳佇列長度即可
3??代碼實作
var RecentCounter = function() {
this.arrP=[]
};
/**
* @param {number} t
* @return {number}
*/
RecentCounter.prototype.ping = function(t) {
//入隊
this.arrP.push(t)
//當請求是3000毫秒之前時踢出隊
while(this.arrP[0]<t-3000){
this.arrP.shift();
}
//回傳佇列長度
return this.arrP.length
};
/**
* Your RecentCounter object will be instantiated and called as such:
* var obj = new RecentCounter()
* var param_1 = obj.ping(t)
*/
可以看出其實在記憶體上還有很多改進的空間,大家如果有什么好的方法歡迎指教 🙏

占坑
代碼模板里可能涉及到了建構式、類和繼承的概覽,不明白的可以看這兩篇文章,也許能讓你更不明白😁
?? 最通俗易懂的JavaScript繼承和原型
??吃了這顆糖,建構式變class類
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/290297.html
標籤:其他
