[LeetCode] 1472. Design Browser History

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 the homepage of the browser.
  • void visit(string url) Visits url from the current page. It clears up all the forward history.
  • string back(int steps) Move steps back in history. If you can only return x steps in the history and steps > x, you will return only x steps. Return the current url after moving back in history at most steps.
  • string forward(int steps) Move steps forward in history. If you can only forward x steps in the history and steps > x, you will forward only x steps. Return the current url after forwarding in history at most steps.

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 and url consist of  '.' or lower case English letters.
  • At most 5000 calls will be made to visitback, and forward.

设计浏览器历史记录。

你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 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 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-browser-history
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这是一道设计题。我这里给出两种解法。一种用单链表,一种用双链表。

首先是单链表。初始化的时候我需要一个空的 array list 和几个变量,index 表示 list 的下标,即当前我在哪个页面上;size 表示当前 list 里面有效的,能访问到的范围的上限。注意这里我创建的 array list 是不会删除元素的,只会修改或者增加。

visit()
如果当前的 index + 1 小于 list.size(),说明 list 长度足够,只能在对应下标修改,把新访问的 url 放入 index + 1 的位置,同时 size 要视情况变化。
 
back()
forward()
这两个函数其实思路类似,都是去取 list size 范围内的一个正确的 index。back() 找的是 size 范围内最小的但是不小于 0 的 index,也就是说无论后退几步,最多只能后退到 homepage。forward() 找的是 list size 范围内 index 最大的页面但是 index 不能大于 list size(有效的范围),所以取的是 size - 1 和 index + steps 的较小值。

时间O(1)

空间O(n)

Java实现

 1 class BrowserHistory {
 2     List<String> list;
 3     int index;
 4     int size;
 5     
 6     public BrowserHistory(String homepage) {
 7         list = new ArrayList<>();
 8         list.add(homepage);
 9         index = 0;
10         size = 1;
11     }
12     
13     public void visit(String url) {
14         if (index + 1 < list.size()) {
15             list.set(index + 1, url);
16         } else {
17             list.add(url);
18         }
19         index++;
20         size = index + 1;
21     }
22     
23     public String back(int steps) {
24         index = Math.max(0, index - steps);
25         return list.get(index);
26     }
27     
28     public String forward(int steps) {
29         index = Math.min(size - 1, index + steps);
30         return list.get(index);
31     }
32 }
33 
34 /**
35  * Your BrowserHistory object will be instantiated and called as such:
36  * BrowserHistory obj = new BrowserHistory(homepage);
37  * obj.visit(url);
38  * String param_2 = obj.back(steps);
39  * String param_3 = obj.forward(steps);
40  */

 

再来是双链表。

时间O(1)

空间O(n)

Java实现

 1 class BrowserHistory {
 2     class Node {
 3         String url;
 4         Node prev;
 5         Node next;
 6 
 7         public Node(String url) {
 8             this.url = url;
 9             prev = null;
10             next = null;
11         }
12     }
13 
14     Node head;
15     Node cur;
16 
17     public BrowserHistory(String homepage) {
18         head = new Node(homepage);
19         cur = head;
20     }
21 
22     public void visit(String url) {
23         Node node = new Node(url);
24         cur.next = node;
25         node.prev = cur;
26         cur = node;
27     }
28 
29     public String back(int steps) {
30         while (cur.prev != null && steps > 0) {
31             cur = cur.prev;
32             steps--;
33         }
34         return cur.url;
35     }
36 
37     public String forward(int steps) {
38         while (cur.next != null && steps > 0) {
39             cur = cur.next;
40             steps--;
41         }
42         return cur.url;
43     }
44 }
45 
46 /**
47  * Your BrowserHistory object will be instantiated and called as such:
48  * BrowserHistory obj = new BrowserHistory(homepage);
49  * obj.visit(url);
50  * String param_2 = obj.back(steps);
51  * String param_3 = obj.forward(steps);
52  */

 

posted @ 2021-03-04 03:00  CNoodle  阅读(423)  评论(0编辑  收藏  举报