題目連結:
題目意譯:
你有只有一個分頁的瀏覽器,而你一開始在首頁頁面上。你可以瀏覽其他鏈結、往歷史記錄前面的方向若干步或是往歷史記錄後面的方向若干步來跳到對應的頁面。
實作類別 BrowserHistory:
BrowserHistory(string 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 網址。
限制:
1 ≦ homepage.length ≦ 20
1 ≦ url.length ≦ 20
1 ≦ steps ≦ 100
homepage 和 url 由 '.' 和小寫英文字母組成。
最多 5000 次呼叫為 visit 、 back 和 forward。
範例測資:
範例:
輸入:
["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"。
解題思維:
用一個字串陣列 S 、一個指標 X 來指向當前網站的「下一個位置」(方便跟 C 配對)以及一個變數 C 來代表整個歷史記錄有多少網頁來模擬即可。
一開始初始化時,把 X 指向「1」這個位置,並將 S[0] 存 homepage 這個字串。
呼叫 back 時,將 X 移動到 max(X - steps, 1) 這個位置(因為不能移動到首頁「之前」,最多只能回到首頁)。而當前頁面為 S[X - 1]。
呼叫 forward 時,將 X 移動到 min(X + steps, C) 這個位置(因為 S[C] 還不存在,所以 X 頂多只能到 C 這邊)。而一樣,S[X - 1] 為當前頁面。
而呼叫 visit 時,將 S[X] 設為 url。同時將 C 設為 X + 1 以及將 X 加上 1。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。