-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathBrowserHistory.java
More file actions
87 lines (79 loc) * 3.67 KB
/
BrowserHistory.java
File metadata and controls
87 lines (79 loc) * 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package Leetcode;
import java.util.ArrayDeque;
import java.util.Deque;
/**
* @author kalpak
*
* 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 visit, back, and forward.
*/
public class BrowserHistory {
Deque<String> history;
Deque<String> goForward;
public BrowserHistory(String homepage) {
history = new ArrayDeque<>();
goForward = new ArrayDeque<>();
history.push(homepage);
}
public void visit(String url) {
history.push(url);
goForward = new ArrayDeque<>();
}
public String back(int steps) {
while(steps > 0 && history.size() > 1) {
// Always keep at least one element in the stack.
goForward.push(history.peek());
history.poll();
steps--;
}
return history.peek();
}
public String forward(int steps) {
while(steps > 0 && goForward.size() > 0) {
history.push(goForward.peek());
goForward.poll();
steps--;
}
return history.peek();
}
}