1472. 设计浏览器历史记录
1472. 设计浏览器历史记录
🟠 🔖 栈
设计
数组
链表
数据流
双向链表
🔗 力扣
LeetCode
题目
You have a browser of one tab where you start on the homepage
and you can visit another url
, get back in the history number of steps
or move forward in the history number of steps
.
Implement the BrowserHistory
class:
BrowserHistory(string homepage)
Initializes the object with thehomepage
of the browser.void visit(string url)
Visitsurl
from the current page. It clears up all the forward history.string back(int steps)
Movesteps
back in history. If you can only returnx
steps in the history andsteps > x
, you will return onlyx
steps. Return the currenturl
after moving back in history at moststeps
.string forward(int steps)
Movesteps
forward in history. If you can only forwardx
steps in the history andsteps > x
, you will forward onlyx
steps. Return the currenturl
after forwarding in history at moststeps
.
Example:
Input:
["BrowserHistory","visit","visit","visit","back","back","forward","visit","forward","back","back"]
[["leetcode.com"],["google.com"],["facebook.com"],["youtube.com"],[1],[1],[1],["linkedin.com"],[2],[2],[7]]
Output:
[null,null,null,null,"facebook.com","google.com","facebook.com",null,"linkedin.com","google.com","leetcode.com"]
Explanation:
BrowserHistory browserHistory = new BrowserHistory("leetcode.com");
browserHistory.visit("google.com") // You are in "leetcode.com". Visit "google.com"
browserHistory.visit("facebook.com") // You are in "google.com". Visit "facebook.com"
browserHistory.visit("youtube.com") // You are in "facebook.com". Visit "youtube.com"
browserHistory.back(1); // You are in "youtube.com", move back to "facebook.com" return "facebook.com"
browserHistory.back(1); // You are in "facebook.com", move back to "google.com" return "google.com"
browserHistory.forward(1); // You are in "google.com", move forward to "facebook.com" return "facebook.com"
browserHistory.visit("linkedin.com") // You are in "facebook.com". Visit "linkedin.com"
browserHistory.forward(2); // You are in "linkedin.com", you cannot move forward any steps.
browserHistory.back(2); // You are in "linkedin.com", move back two steps to "facebook.com" then to "google.com". return "google.com"
browserHistory.back(7); // You are in "google.com", you can move back only one step to "leetcode.com". return "leetcode.com"
Constraints:
1 <= homepage.length <= 20
1 <= url.length <= 20
1 <= steps <= 100
homepage
andurl
consist of '.' or lower case English letters.- At most
5000
calls will be made tovisit
,back
, andforward
.
题目大意
设计一个只支持单个标签页的 浏览器 ,最开始浏览的网页是 homepage
,可以访问其他的网站 url
,也可以在浏览历史中后退 steps
步或前进 steps
步。
解题思路
使用栈来存储浏览器的访问历史,使用 cur_index
变量来存储当前访问的网址在栈中的位置。
- visit:
- 先清空
cur_index
之后的历史记录; - 将
url
放入栈顶; - 将
cur_index
指向栈顶;
- 先清空
- back:比较栈中存储的历史记录数
n
和steps
的大小,最多只能倒退n
步 - forward: 比较
cur_index
之后的历史记录数m
和steps
的大小,最多只能前进m
步
代码
class BrowserHistory {
// @param {string} homepage
constructor(homepage) {
this.history = [homepage];
this.cur_index = 0;
}
// @param {string} url
// @return {void}
visit(url) {
// clear forward history
this.history = this.history.slice(0, this.cur_index + 1);
this.history.push(url);
this.cur_index++;
}
// @param {number} steps
// @return {string}
back(steps) {
this.cur_index = Math.max(0, this.cur_index - steps);
return this.history[this.cur_index];
}
// @param {number} steps
// @return {string}
forward(steps) {
this.cur_index = Math.min(this.history.length - 1, this.cur_index + steps);
return this.history[this.cur_index];
}
}
/**
* Your BrowserHistory object will be instantiated and called as such:
* var obj = new BrowserHistory(homepage)
* obj.visit(url)
* var param_2 = obj.back(steps)
* var param_3 = obj.forward(steps)
*/
相关题目
题号 | 标题 | 题解 | 标签 | 难度 |
---|---|---|---|---|
2254 | 设计视频共享平台 🔒 | 栈 设计 哈希表 1+ |