【LeetCode】1472. 設計瀏覽器歷史記錄 Design Browser History (Python)


題目地址: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 日 —— 端午節快樂

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章