力扣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指针记录前进上限,避免重复计算。
该设计兼顾时间复杂度与代码简洁性,适用于类似需要双向移动指针的场景。建议进一步优化极端情况(如频繁后退)的性能。
原创内容 转载请注明出处



