每日一题-设计浏览器历史记录,关于栈的应用
本题出自LeetCode1472.设计浏览器历史记录
题目
你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是
homepage
,你可以访问其他的网站url
,也可以在浏览历史中后退steps
步或前进steps
步。请你实现
BrowserHistory
类:
BrowserHistory(string homepage)
,用homepage
初始化浏览器类。void visit(string url)
从当前页跳转访问url
对应的页面 。执行此操作会把浏览历史前进的记录全部删除。string back(int steps)
在浏览历史中后退steps
步。如果你只能在浏览历史中后退至多x
步且steps > x
,那么你只后退x
步。请返回后退 至多steps
步以后的url
。string forward(int steps)
在浏览历史中前进steps
步。如果你只能在浏览历史中前进至多x
步且steps > x
,那么你只前进x
步。请返回前进 至多steps
步以后的url
。
示例
输入: ["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]] 输出: [null,null,null,null,"facebook.com","google.com","facebook.com",null,"linkedin.com","google.com","leetcode.com"] 解释: BrowserHistory browserHistory = new BrowserHistory("leetcode.com"); browserHistory.visit("google.com"); // 你原本在浏览 "leetcode.com" 。访问 "google.com" browserHistory.visit("facebook.com"); // 你原本在浏览 "google.com" 。访问 "facebook.com" browserHistory.visit("youtube.com"); // 你原本在浏览 "facebook.com" 。访问 "youtube.com" browserHistory.back(1); // 你原本在浏览 "youtube.com" ,后退到 "facebook.com" 并返回 "facebook.com" browserHistory.back(1); // 你原本在浏览 "facebook.com" ,后退到 "google.com" 并返回 "google.com" browserHistory.forward(1); // 你原本在浏览 "google.com" ,前进到 "facebook.com" 并返回 "facebook.com" browserHistory.visit("linkedin.com"); // 你原本在浏览 "facebook.com" 。 访问 "linkedin.com" browserHistory.forward(2); // 你原本在浏览 "linkedin.com" ,你无法前进任何步数。 browserHistory.back(2); // 你原本在浏览 "linkedin.com" ,后退两步依次先到 "facebook.com" ,然后到 "google.com" ,并返回 "google.com" browserHistory.back(7); // 你原本在浏览 "google.com", 你只能后退一步到 "leetcode.com" ,并返回 "leetcode.com"
基础代码框架
class BrowserHistory {
public BrowserHistory(String homepage) {
}
public void visit(String url) {
}
public String back(int steps) {
}
public String forward(int steps) {
}
}
题解 一
class BrowserHistory {
private List<String> timeslices = new ArrayList<>();
private final String homepage;
private int idx = 0;
public BrowserHistory(String h) {
homepage = h;
timeslices.add(homepage);
}
public void visit(String url) {
timeslices = new ArrayList(timeslices.subList(0, idx + 1));
timeslices.add(url);
idx++;
}
public String back(int steps) {
if (idx - steps <= 0) {
idx = 0;
return homepage;
}
idx = idx - steps;
return timeslices.get(idx);
}
public String forward(int steps) {
if (steps + idx >= timeslices.size() ) {
idx = timeslices.size() - 1;
return timeslices.get(idx);
}
idx = idx + steps;
return timeslices.get(idx);
}
}
解题思路一
为了实现一个支持后退和前进功能的浏览器历史记录管理类,我们需要模拟浏览器的历史记录行为。
数据结构选择:
- 使用一个列表(
List<String>
)来存储历史记录,其中每个元素代表一个页面的 URL。- 使用一个整数变量(
idx
)来跟踪当前所在的页面位置。初始化:
- 在类的构造函数中,将主页(
homepage
)添加到列表中,并将索引初始化为 0,表示当前位于主页。访问新页面:
- 当访问新页面时,需要将当前页面及之后的所有前进记录清空。这可以通过截断列表到当前索引 + 1 的位置,然后添加新的 URL 并增加索引来实现。
后退操作:
- 后退操作需要根据给定的步数(
steps
)调整当前索引。如果步数超过可后退的范围,则将索引调整到 0(主页)。- 返回调整后的当前页面 URL。
前进操作:
- 前进操作需要根据给定的步数(
steps
)调整当前索引。如果步数超过可前进的范围,则将索引调整到列表的最后一个位置。- 返回调整后的当前页面 URL。
破题关键
初始化历史记录:
- 在构造函数中,将主页添加到列表中,并设置初始索引为 0。
处理访问新页面:
- 当访问新页面时,截断列表到当前索引 + 1 的位置,以清空所有前进记录。
- 将新 URL 添加到列表末尾,并将索引增加 1。
处理后退操作:
- 计算后退后的索引位置,如果步数超过可后退的范围,则将索引设置为 0。
- 返回后退后的当前页面 URL。
处理前进操作:
- 计算前进后的索引位置,如果步数超过可前进的范围,则将索引设置为列表的最后一个位置。
- 返回前进后的当前页面 URL。
题解二
class BrowserHistory {
String[] history=new String[5001];
int index;
int bound;
public BrowserHistory(String homepage) {
history[0]=homepage;
index=0;
bound=0;
}
public void visit(String url) {
index++;
history[index]=url;
bound=index;
}
public String back(int steps) {
if(steps>index){
index=0;
return history[index];
}
index-=steps;
return history[index];
}
public String forward(int steps) {
if(index+steps>bound){
index=bound;
return history[index];
}
index+=steps;
return history[index];
}
}
解题思路二
为了实现一个支持后退和前进功能的浏览器历史记录管理类,我们需要模拟浏览器的历史记录行为。以下是实现该类的详细思路:
数据结构选择:
- 使用一个列表(
history
)来存储浏览的历史记录,每个元素代表一个访问的 URL。- 使用两个指针:
index
表示当前所在的页面位置,bound
表示历史记录的最远位置(即访问过的新页面的最远索引)。初始化:
- 在构造函数中,初始化历史记录列表,将主页设置为第一个元素,并将
index
和bound
初始化为 0。访问新页面:
visit
方法用于访问新页面。每次访问新页面时,index
增加 1,新的 URL 被存储在history
列表中,并更新bound
为当前index
,表示新的最远位置。后退操作:
back
方法用于后退指定的步数。如果后退的步数超过当前可以后退的最大步数(即index
的值),则直接回到主页(index
设为 0)。否则,index
减去指定的步数。前进操作:
forward
方法用于前进指定的步数。如果前进的步数超过当前可以前进的最大步数(即index
到bound
的距离),则直接回到最远位置(index
设为bound
)。否则,index
加上指定的步数。破题关键
- 历史记录的存储:使用一个列表来存储所有访问过的 URL,确保能够快速访问和修改。
- 指针的维护:通过
index
和bound
来维护当前页面的位置和历史记录的最远位置,确保后退和前进操作的高效性。- 边界条件处理:在后退和前进操作中,处理超出边界的情况,确保不会越界访问历史记录列表。
制作不易,您的关注与点赞是我最大的动力! 欢迎订阅!