当前位置:首页 > 力扣 > 力扣1472题解:浏览器历史记录模拟(C++代码实现与详细解析)

力扣1472题解:浏览器历史记录模拟(C++代码实现与详细解析)

22小时前

力扣1472题解:浏览器历史记录模拟(C++代码实现与详细解析) 力扣1472题 浏览器 历史记录 模拟 C++算法题解 代码优化技巧 算法设计思路 第1张

一、题目解读

力扣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指针记录前进上限,避免重复计算。

该设计兼顾时间复杂度与代码简洁性,适用于类似需要双向移动指针的场景。建议进一步优化极端情况(如频繁后退)的性能。


原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。