题目地址:https://leetcode-cn.com/problems/design-browser-history/

题目描述

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

提示:

  1. 1 <= homepage.length <= 20
  2. 1 <= url.length <= 20
  3. 1 <= steps <= 100
  4. homepageurl 都只包含 '.' 或者小写英文字母。
  5. 最多调用 5000 次 visitbackforward 函数。

题目大意

本题是模拟浏览器的前进和后退操作。
forward()back()函数分别代表前进和后退。
visit()函数会访问一个新界面,同时会把之前回退的页面都清空。

解题方法

模拟法

需要有个数据结构能够很快的前进和后退 n 步,第一感觉是,但是一般认为栈中的数据弹出之后就不存在了,因此后退了之后就不能前进。故最终使用数组来模拟。

使用一个数组his保存所有的访问记录,使用cur保存当前处于数组中的哪个位置。

  1. __init__(str)函数:初始化时把homepage放入数组中。
  2. forward(steps)函数:会让cur前进steps步,但是注意不能超出数组的右边界。
  3. back(steps)函数:会让cur后退steps步,但是注意不能少于数组的左边界。
  4. visit(url)函数:会先把cur位置以后的所有历史记录清空,然后把url放到his数组的后面。

Python 代码如下:

class BrowserHistory:

    def __init__(self, homepage: str):
self.his = [homepage]
self.cur = 0 def visit(self, url: str) -> None:
while self.his and len(self.his) - 1 > self.cur:
self.his.pop()
self.his.append(url)
self.cur += 1 def back(self, steps: int) -> str:
self.cur -= min(self.cur, steps)
return self.his[self.cur] def forward(self, steps: int) -> str:
self.cur += steps
self.cur = min(self.cur, len(self.his) - 1)
return self.his[self.cur] # Your BrowserHistory object will be instantiated and called as such:
# obj = BrowserHistory(homepage)
# obj.visit(url)
# param_2 = obj.back(steps)
# param_3 = obj.forward(steps)

欢迎关注负雪明烛的刷题博客,leetcode刷题800多,每道都讲解了详细写法!

日期

2020 年 6 月 28 日 —— 端午节快乐

最新文章

  1. (转)oracle中用户删除不了,ORA-01940提示 “无法删除当前已连接用户”
  2. js判断字符串中是否含有指定汉语
  3. Mongodb源代码阅读笔记:Journal机制
  4. SQL Server 2008 FILESTREAM特性管理文件
  5. Google V8扩展利器发布:v8-native-binding-generator
  6. KVO机制
  7. volatile用处说明
  8. Winform控件Enable=false显示优化
  9. HDU 2187 A sequence of numbers
  10. POI实现Excel导入导出
  11. BZOJ_4198_[Noi2015]荷马史诗_huffman实现
  12. filter的使用
  13. nginx连接数优化
  14. Swagger Annotation 详解(建议收藏)
  15. request和response简介
  16. 注意!list和array是不同的
  17. log4j生成有日期的日志文件名
  18. 【ArcGIS】ArcGIS Android SDK
  19. Ubuntu14.04下Sublime Text 3解决无法输入中文
  20. myeclipse工程重名后怎么更改deploy location?

热门文章

  1. 【宏组学】如何根据taxid(或taxname)快速获得taxname(或taxid)?
  2. MariaDB—配置允许(别的电脑IP)远程访问方式
  3. 45-Letter Combinations of a Phone Number
  4. 前端4 — jQuery — 更新完毕
  5. words in English that contradict themselves
  6. 在idea的java开发中字符串length()方法获取长度与赋值不符的问题
  7. 乱序拼图验证的识别并还原-puzzle-captcha
  8. HttpClient连接池设置引发的一次雪崩
  9. ORACLE 查询sql和存储性能思路
  10. Linux基础命令---lynx浏览器