首页 > 其他分享 >Leetcode 1472. 设计浏览器历史记录

Leetcode 1472. 设计浏览器历史记录

时间:2024-09-25 10:54:35浏览次数:9  
标签:浏览器 backStack url self 栈顶 1472 forwardStack steps Leetcode

1.题目基本信息

1.1.题目描述

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

1.2.题目地址

https://leetcode.cn/problems/design-browser-history/description

2.解题方法

2.1.解题思路

构建双栈的数据结构,backStack栈为历史访问记录栈,其栈顶表示当前页面,forwardStack为前进能访问的栈。

2.2.解题步骤

第一步,设计双栈数据结构

第二步,当访问新url时,直接将url添加到backStack顶部,为新的当前页面,同时清空forwardStack栈中前进访问的url

第三步,当回退时,只需从backStack栈顶弹出,同时将弹出的url加到forwardStack栈顶即可(需要保证backStack不为空,因为栈顶为当前页面必须保证存在)

第四步,当前进时,只需从forwardStack栈顶弹出url并添加到backStack栈顶(直到forwardStack为空,前进访问的url可以没有)

3.解题代码

Python代码

class BrowserHistory:
    # 关键:构建双栈的数据结构,backStack栈为历史访问记录栈,其栈顶表示当前页面,forwardStack为前进能访问的栈。第一步,设计双栈数据结构。第二步,当访问新url时,直接将url添加到backStack顶部,为新的当前页面,同时清空forwardStack栈中前进访问的url。第三步,当回退时,只需从backStack栈顶弹出,同时将弹出的url加到forwardStack栈顶即可(需要保证backStack不为空,因为栈顶为当前页面必须保证存在)。第四步,当前进时,只需从forwardStack栈顶弹出url并添加到backStack栈顶(直到forwardStack为空,前进访问的url可以没有)
    def __init__(self, homepage: str):
        # backStack的栈顶维护为当前页面
        self.backStack=[]
        self.forwardStack=[]
        self.backStack.append(homepage)

    def visit(self, url: str) -> None:
        self.backStack.append(url)
        self.forwardStack.clear()

    def back(self, steps: int) -> str:
        for i in range(steps):
            if len(self.backStack)>1:
                self.forwardStack.append(self.backStack.pop())
        return self.backStack[-1]

    def forward(self, steps: int) -> str:
        for i in range(steps):
            if len(self.forwardStack)>0:
                self.backStack.append(self.forwardStack.pop())
        return self.backStack[-1]

C++代码

class BrowserHistory {
public:
    stack<string> backStack;
    stack<string> forwardStack;

    BrowserHistory(string homepage) {
        backStack.push(homepage);
    }
    
    void visit(string url) {
        backStack.push(url);
        while(!forwardStack.empty()){
            forwardStack.pop();
        }
    }
    
    string back(int steps) {
        for(int i=0;i<steps;++i){
            if(backStack.size()>1){
                string tempUrl=backStack.top();
                forwardStack.push(tempUrl);
                backStack.pop();
            }
        }
        return backStack.top();
    }
    
    string forward(int steps) {
        for(int i=0;i<steps;++i){
            if(!forwardStack.empty()){
                string tempUrl=forwardStack.top();
                backStack.push(tempUrl);
                forwardStack.pop();
            }
        }
        return backStack.top();
    }
};

4.执行结果

在这里插入图片描述

标签:浏览器,backStack,url,self,栈顶,1472,forwardStack,steps,Leetcode
From: https://www.cnblogs.com/geek0070/p/18430845

相关文章

  • Leetcode 1396. 设计地铁系统
    1.题目基本信息1.1.题目描述地铁系统跟踪不同车站之间的乘客出行时间,并使用这一数据来计算从一站到另一站的平均时间。实现UndergroundSystem类:voidcheckIn(intid,stringstationName,intt)通行卡ID等于id的乘客,在时间t,从stationName站进入乘客一次只......
  • C# 开源浏览器性能提升,体验Chrome级速度
    前言使用C#和CefSharp开发的全功能网页浏览器。项目介绍SharpBrowser是目前最快的开源C#网页浏览器!采用了轻量级的CEF渲染器,在呈现网页时甚至比GoogleChrome更快。我们对比了所有可用的.NET浏览器引擎,最终选择了高性能的CefSharp。SharpBrowser使用了CefSha......
  • 计算机低能儿从0刷leetcode | 17.电话号码的数字组合 | 回溯思想
    题目:17.电话号码的字母组合解答:看题解学习到这种思想叫做回溯法,学习了一下,这是建立在DFS的基础上搜索思路,还分为递归式回溯以及非递归式回溯,这道题使用的是递归回溯。递归回溯的大致框架如下:voidDFS(inti){//搜索第i层   if(i>n){//搜索结束       ......
  • leetcode 2207. 字符串中最多数目的子序列
    3/100天刷题记录字符串中最多数目的子序列](https://leetcode.cn/problems/maximize-number-of-subsequences-in-a-string/)给你一个下标从0开始的字符串text和另一个下标从0开始且长度为2的字符串pattern,两者都只包含小写英文字母。你可以在text中任意位置......
  • 【算法题】20. 有效的括号-力扣(LeetCode)
    【算法题】20.有效的括号-力扣(LeetCode)1.题目下方是力扣官方题目的地址20.有效的括号给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对......
  • 【算法题】11. 盛最多水的容器-力扣(LeetCode)
    【算法题】11.盛最多水的容器-力扣(LeetCode)1.题目下方是力扣官方题目的地址11.盛最多水的容器给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的......
  • 【算法题】53. 最大子数组和-力扣(LeetCode)
    【算法题】53.最大子数组和-力扣(LeetCode)1.题目下方是力扣官方题目的地址53.最大子数组和给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2,1,-......
  • 【LeetCode Hot 100】17. 电话号码的字母组合
    题目描述本题需要用回溯算法遍历穷举所有可能的解。回溯算法维护一个字符串序列,记录已经有的字母排列,用一个索引值记录该字符串序列下一个将要处理的位置。每次递归将索引值加一,回溯之后将字符串序列中上次加入的字符退出序列中,枚举下一个可能的值。总的来说是一个较为基础的回溯......
  • Chrome浏览器下载时提示“保留”
    1.提示情况具体提示情况情况如下:2.解决方法 2.1.选中地址栏“查看网站信息”具体弹出框如下 2.2.修改“网站设置”在确认网站安全的情况下,把“自动下载项”修改为“允许”,把“不安全内容”修改为“允许”。2.3.关闭“网站设置”页面重新下载,就不在出现“保留”......
  • 浏览器进程模型大揭秘:从原理到实践
    浏览器的进程模型何为进程?程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程。每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。何为线程?有了进程后,就可以运行程序的代码了。运行代码的「人」称之为「线程」。一个进程至少有一个线程,所以......