力扣1472题解:浏览器历史记录模拟(C++代码实现与详细解析)
一、题目解读
力扣1472题要求设计一个“浏览器历史记录”类,支持以下功能:
1. 初始化浏览器,指定首页URL;
2. visit(url):访问新页面,清除当前位置后的历史记录并添加新URL;
3. back(steps):后退指定步数,返回对应URL(若步数超出范围则回到首页);
4. forward(steps):前进指定步数,返回对应URL(若步数超出范围则保持当前页)。
题目核心在于高效管理历史记录状态与指针移动逻辑。
二、解题思路
代码采用vector<string>存储历史URL,通过current指针标记当前位置,last记录最后一次访问的位置。关键思路如下:
1. 访问新页面时:若current未到末尾,先删除其后所有历史记录,再添加新URL,更新current和last;
2. 后退/前进操作:通过max/min函数限制指针移动范围,确保不越界,直接返回对应索引的URL。
此设计简化了边界判断,利用vector动态特性避免手动维护双向链表,降低复杂度。
三、解题步骤
1. 初始化:
首页URL存入history,current与last初始化为0。
2. visit(url)`:
若current < history.size() - 1,删除当前位置后的所有元素;
添加url到末尾,更新current = last = history.size() - 1。
3. back(steps)`:
计算新位置:current = max(0, current - steps),确保不超出左边界;
返回history[current]。
4. forward(steps)`:
计算新位置:current = min(last, current + steps),确保不超出last;
返回history[current]。
通过对称的边界处理,保证后退/前进操作的一致性。
四、代码与注释
class BrowserHistory { private: vector<string> history; // 历史记录列表 int current; // 当前位置指针 int last; // 最后一次访问的位置 public: BrowserHistory(string homepage) { history.push_back(homepage); // 添加首页 current = 0; // 初始化指针 last = 0; } void visit(string url) { // 若当前位置未到末尾,删除后续历史记录 if (current < (int)history.size() - 1) { history.erase(history.begin() + current + 1, history.end()); } history.push_back(url); // 添加新URL current++; // 更新当前位置 last = current; // 更新最后位置 } string back(int steps) { // 后退至max(0, current - steps),避免越界 current = max(0, current - steps); return history[current]; } string forward(int steps) { // 前进至min(last, current + steps),避免超过最后一次访问位置 current = min(last, current + steps); return history[current]; } };
五、总结
本解法通过单向vector + 指针管理高效实现浏览器历史模拟,关键在于:
1. 利用erase与push_back动态调整历史记录,减少冗余存储;
2. 通过max/min函数封装边界逻辑,提升代码鲁棒性;
3. last指针记录前进上限,避免重复计算。
该设计兼顾时间复杂度与代码简洁性,适用于类似需要双向移动指针的场景。建议进一步优化极端情况(如频繁后退)的性能。
原创内容 转载请注明出处