Problem
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 thehomepageof the browser.void visit(string url)Visitsurlfrom the current page. It clears up all the forward history.string back(int steps)Movestepsback in history. If you can only returnxsteps in the history andsteps > x, you will return onlyxsteps. Return the currenturlafter moving back in history at moststeps.string forward(int steps)Movestepsforward in history. If you can only forwardxsteps in the history andsteps > x, you will forward onlyxsteps. Return the currenturlafter forwarding in history at moststeps.
https://leetcode.cn/problems/design-browser-history/
Example 1:
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:
1
2
3
4
5
6
7
8
9
10
11 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 <= 201 <= url.length <= 201 <= steps <= 100homepageandurlconsist of ‘.’ or lower case English letters.- At most
5000calls will be made tovisit,back, andforward.
Test Cases
1 | class BrowserHistory: |
1 | import pytest |
Thoughts
用数组记录访问历史,用一个变量 current 记录当前访问的是历史记录中的哪一条。前进和后退的时候就增减这个记录值(处理好边界)。
访问新地址的时候,current 右边的原有历史记录全部失效,先对 current 自增,然后把新地址存入 current 对应的数组位置。当然如果 current 自增前就已经是数组的最右,则需要把新地址添加到数组末尾。如果 current 右边还有很多空间,可以不用直接释放掉,而是用另一个变量记录当前有效的历史记录数量,减少内存分配的波动(用 Python 可能不太需要自行处理这个)。
构造方法时间复杂度 O(1),visit 方法时间复杂度平均为 O(1),back 和 forward 方法时间复杂度 O(1)。空间复杂度 O(n)。
Code
1 | class BrowserHistory: |