diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 405943c..33304de 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -506,3 +506,5 @@ mod p1206_design_skiplist; mod p1656_design_an_ordered_stream; mod p2502_design_memory_allocator; + +mod p1472_design_browser_history; diff --git a/src/problem/p1472_design_browser_history.rs b/src/problem/p1472_design_browser_history.rs new file mode 100644 index 0000000..b8d09a5 --- /dev/null +++ b/src/problem/p1472_design_browser_history.rs @@ -0,0 +1,87 @@ +/** + * [1472] Design Browser History + */ +pub struct Solution {} + +// submission codes start here + +struct BrowserHistory { + history: Vec, + pos: usize, +} + +/** + * `&self` means the method takes an immutable reference. + * If you need a mutable reference, change it to `&mut self` instead. + */ +impl BrowserHistory { + fn new(homepage: String) -> Self { + Self { + history: vec![homepage], + pos: 0, + } + } + + fn visit(&mut self, url: String) { + // 删除前向的所有网站 + for _ in self.pos + 1..self.history.len() { + self.history.pop(); + } + + self.history.push(url); + self.pos += 1; + } + + fn back(&mut self, steps: i32) -> String { + let steps = steps as usize; + if steps > self.pos { + self.pos = 0; + } else { + self.pos -= steps; + } + + self.history[self.pos].clone() + } + + fn forward(&mut self, steps: i32) -> String { + let steps = steps as usize; + if steps + self.pos >= self.history.len() { + self.pos = self.history.len() - 1; + } else { + self.pos += steps; + } + + self.history[self.pos].clone() + } +} + +/** + * Your BrowserHistory object will be instantiated and called as such: + * let obj = BrowserHistory::new(homepage); + * obj.visit(url); + * let ret_2: String = obj.back(steps); + * let ret_3: String = obj.forward(steps); + */ + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_1472() { + let mut history = BrowserHistory::new("leetcode.com".to_owned()); + + history.visit("google.com".to_owned()); + history.visit("facebook.com".to_owned()); + history.visit("youtube.com".to_owned()); + assert_eq!("facebook.com", history.back(1)); + assert_eq!("google.com", history.back(1)); + assert_eq!("facebook.com", history.forward(1)); + history.visit("linkedin.com".to_owned()); + assert_eq!("linkedin.com", history.forward(2)); + assert_eq!("google.com", history.back(2)); + assert_eq!("leetcode.com", history.back(7)); + } +}