当前位置: 首页 > news >正文

每日一题-设计浏览器历史记录,关于栈的应用

本题出自LeetCode1472.设计浏览器历史记录


题目 

你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 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"

基础代码框架 

class BrowserHistory {

    public BrowserHistory(String homepage) {
        
    }
    
    public void visit(String url) {
        
    }
    
    public String back(int steps) {
        
    }
    
    public String forward(int steps) {
        
    }
}

 题解 一

class BrowserHistory {

    private List<String> timeslices = new ArrayList<>();
    private final String homepage;
    private int idx = 0;

    public BrowserHistory(String h) {
        homepage = h;
        timeslices.add(homepage);
    }
    
    public void visit(String url) {  
        timeslices = new ArrayList(timeslices.subList(0, idx + 1));
        timeslices.add(url);
        idx++;
    }
    
    public String back(int steps) {
        if (idx - steps <= 0) {
            idx = 0;
            return homepage;
        }
        idx = idx - steps;
        return timeslices.get(idx);
    }
    
    public String forward(int steps) {
        if (steps + idx >= timeslices.size() ) {
            idx = timeslices.size() - 1;
            return timeslices.get(idx);
        }
        idx = idx + steps;
        return timeslices.get(idx);
    }
}

解题思路一

为了实现一个支持后退和前进功能的浏览器历史记录管理类,我们需要模拟浏览器的历史记录行为。

 
  1. 数据结构选择

    • 使用一个列表(List<String>)来存储历史记录,其中每个元素代表一个页面的 URL。
    • 使用一个整数变量(idx)来跟踪当前所在的页面位置。
  2. 初始化

    • 在类的构造函数中,将主页(homepage)添加到列表中,并将索引初始化为 0,表示当前位于主页。
  3. 访问新页面

    • 当访问新页面时,需要将当前页面及之后的所有前进记录清空。这可以通过截断列表到当前索引 + 1 的位置,然后添加新的 URL 并增加索引来实现。
  4. 后退操作

    • 后退操作需要根据给定的步数(steps)调整当前索引。如果步数超过可后退的范围,则将索引调整到 0(主页)。
    • 返回调整后的当前页面 URL。
  5. 前进操作

    • 前进操作需要根据给定的步数(steps)调整当前索引。如果步数超过可前进的范围,则将索引调整到列表的最后一个位置。
    • 返回调整后的当前页面 URL。
 

破题关键

 
  1. 初始化历史记录

    • 在构造函数中,将主页添加到列表中,并设置初始索引为 0。
  2. 处理访问新页面

    • 当访问新页面时,截断列表到当前索引 + 1 的位置,以清空所有前进记录。
    • 将新 URL 添加到列表末尾,并将索引增加 1。
  3. 处理后退操作

    • 计算后退后的索引位置,如果步数超过可后退的范围,则将索引设置为 0。
    • 返回后退后的当前页面 URL。
  4. 处理前进操作

    • 计算前进后的索引位置,如果步数超过可前进的范围,则将索引设置为列表的最后一个位置。
    • 返回前进后的当前页面 URL。

题解二

class BrowserHistory {
    String[] history=new String[5001];
    int index;
    int bound;
    public BrowserHistory(String homepage) {
        history[0]=homepage;
        index=0;
        bound=0;
    }
    
    public void visit(String url) {
        index++;
        history[index]=url;
        bound=index;
    }
    
    public String back(int steps) {
        if(steps>index){
            index=0;
            return history[index];
        }
        index-=steps;
        return history[index];
    }
    
    public String forward(int steps) {
        if(index+steps>bound){
            index=bound;
            return history[index];
        }
        index+=steps;
        return history[index];

    }
}

解题思路二

 

为了实现一个支持后退和前进功能的浏览器历史记录管理类,我们需要模拟浏览器的历史记录行为。以下是实现该类的详细思路:

 
  1. 数据结构选择

    • 使用一个列表(history)来存储浏览的历史记录,每个元素代表一个访问的 URL。
    • 使用两个指针:index 表示当前所在的页面位置,bound 表示历史记录的最远位置(即访问过的新页面的最远索引)。
  2. 初始化

    • 在构造函数中,初始化历史记录列表,将主页设置为第一个元素,并将 index 和 bound 初始化为 0。
  3. 访问新页面

    • visit 方法用于访问新页面。每次访问新页面时,index 增加 1,新的 URL 被存储在 history 列表中,并更新 bound 为当前 index,表示新的最远位置。
  4. 后退操作

    • back 方法用于后退指定的步数。如果后退的步数超过当前可以后退的最大步数(即 index 的值),则直接回到主页(index 设为 0)。否则,index 减去指定的步数。
  5. 前进操作

    • forward 方法用于前进指定的步数。如果前进的步数超过当前可以前进的最大步数(即 index 到 bound 的距离),则直接回到最远位置(index 设为 bound)。否则,index 加上指定的步数。
 

破题关键

 
  • 历史记录的存储:使用一个列表来存储所有访问过的 URL,确保能够快速访问和修改。
  • 指针的维护:通过 index 和 bound 来维护当前页面的位置和历史记录的最远位置,确保后退和前进操作的高效性。
  • 边界条件处理:在后退和前进操作中,处理超出边界的情况,确保不会越界访问历史记录列表。

 制作不易,您的关注与点赞是我最大的动力! 欢迎订阅!

相关文章:

  • 鸿蒙开发第4篇__关于在鸿蒙应用中使用Java语言进行设计
  • 十、大数据资源平台功能架构
  • 使用 frp 实现内网穿透:从零到一的完整指南
  • Uniapp 小程序复制、粘贴功能实现
  • c++:多态
  • 算法题(79):两个数组的交集
  • 七、Redis集群高可用
  • 第74节 绘制点和线条( LineTo 和 MoveTo )
  • lombok 的注解说明
  • 使用DeepSeek/chatgpt等AI工具辅助网络协议流量数据包分析
  • 0—QT ui界面一览
  • 【网络】HTTPS协议原理
  • STM32的C语言软件延时函数
  • Jquery详解
  • 模型和数据集的平台之在Hugging Face上进行模型下载、上传以及创建专属Space
  • 数据存储:一文掌握存储数据到mysql的详细使用
  • HIVE SQL函数之比较函数
  • 51单片机编程学习笔记——LED原理图
  • uni-app 开发 App 、 H5 横屏签名(基于lime-signature)
  • SCIKIT-LEARN 决策树实现csv文档简单的推论预测
  • 国台办:民进党当局所谓“对等尊严”,就是企图改变两岸同属一中
  • 中央网信办:重点整治违规AI产品、利用AI制作发布谣言等突出问题
  • 4月人民币对美元即期汇率微跌,今年以来升值0.48%
  • 是否进行了及时有效处置?伤者情况如何?辽阳市相关负责人就饭店火灾事故答问
  • 阿里开源首个“混合推理模型”:集成“快思考”、“慢思考”能力
  • 宜昌打造“算力之都”:产业链快速延伸,追逐千亿级产值