- 作者: 負雪明燭
- id: fuxuemingzhu
- 個人博客:http://fuxuemingzhu.cn/
題目地址: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 <= homepage.length <= 20
1 <= url.length <= 20
1 <= steps <= 100
homepage
和url
都只包含'.'
或者小寫英文字母。- 最多調用 5000 次
visit
,back
和forward
函數。
題目大意
本題是模擬瀏覽器的前進和後退操作。
forward()
和back()
函數分別代表前進和後退。
visit()
函數會訪問一個新界面,同時會把之前回退的頁面都清空。
解題方法
模擬法
需要有個數據結構能夠很快的前進和後退 n
步,第一感覺是棧,但是一般認爲棧中的數據彈出之後就不存在了,因此後退了之後就不能前進。故最終使用數組來模擬。
使用一個數組his
保存所有的訪問記錄,使用cur
保存當前處於數組中的哪個位置。
__init__(str)
函數:初始化時把homepage
放入數組中。forward(steps)
函數:會讓cur
前進steps
步,但是注意不能超出數組的右邊界。back(steps)
函數:會讓cur
後退steps
步,但是注意不能少於數組的左邊界。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 日 —— 端午節快樂