大厂笔试真题【栈】美团2023春招-火车迷【欧弟算法】全网最全大厂秋招题解

news2024/11/23 12:27:59

文章目录

  • 题目描述与示例
    • 题目描述
    • 输入描述
    • 输出描述
    • 示例一
      • 输入
      • 输出
    • 示例二
      • 输入
      • 输出
  • 解题思路
  • 代码
    • python
    • Java
    • C++
    • 时空复杂度
  • 华为OD算法/大厂面试高频题算法练习冲刺训练

题目描述与示例

题目描述

小美是一个火车迷。最近她在观察家附近火车站的火车驶入和驶出情况,发现火车驶入和驶出的顺序并不一致。经过小美调查发现,原来这个火车站里面有一个类似于栈的结构,如下图所示:

在这里插入图片描述

例如可能1号火车驶入了火车站中的休息区s,在驶出之前2号火车驶入了。那么在这种情况下,1号火车需要等待2号火车倒车出去后才能出去(显然被后面驶入的2号火车挡住了,这个休息区s只有一个出入口)。

出于好奇,小美统计了近些天的火车驶入驶出情况,开始统计和结束统计时休息区s中均是空的。由于中途疏忽,小美觉得自己好像弄错了几个驶入驶出顺序,想请你帮她验证一下。

值得注意的是,小美虽然可能弄错了顺序,但对火车的记录是不重不漏的。

形式化地来形容休息区s,我们视其为一个容量无限大的空间,假设两列火车 ij 同时处于休息区s中,驶入时刻Tin满足Tin(i)<Tin(j),则驶出时间Tout必定满足Tout(i)>Tout(j),即,先进后出。

输入描述

第一行输入一个整数T表示数据组数。

对每组测试而言:

第一行输入一个整数n,表示观察到的火车数量。

第二行输入n个整数x1,x2,...,xn,表示小美记录的火车驶入休息区s的顺序。

第三行输入n个整数y1,y2,...,yn,表示小美记录的火车驶出休息区s的顺序。

1 ≤ T ≤ 101 ≤ n ≤ 500001 ≤ xi, yi ≤n, 且{xn}{yn} 均为{1,2,3,...,n}的一个排列,即1~nn个数在其中不重不漏恰好出现一次。

输出描述

对每组数据输出一行:如果小美记录的驶入和驶出顺序无法被满足则输出No,否则输出Yes

示例一

输入

3
3
1 2 3
1 2 3
3
1 2 3
3 2 1
3
1 2 3
3 1 2

输出

Yes
Yes
No

示例二

输入

3
4
1 2 4 3
1 2 3 4
9
1 2 3 4 5 6 7 8 9
3 2 1 6 5 4 9 8 7
4
1 2 3 4
3 2 1 4

输出

Yes
Yes
Yes

解题思路

注意这是一道非常经典的栈题,本质上和 LeetCode946. 验证栈序列 完全一致。本题有多种解法,只需懂得一种解法即可。

按照时间出现的顺序,考虑A_list中的每一个元素A的行为,一共有两种可能性:

  1. A直接驶入B
  2. A驶入S

我们设置一个B区的索引idx_BB_list[idx_B]表示B区即将驶入的车厢编号

AB_list[idx_B]相等时,A可以直接驶入B区,否则应该驶入S区进行等待。

A驶入B区后,由于先前的idx_B对应的车厢编号B_list[idx_B]已经满足,故需要考虑B区的下一个即将驶入的车厢,故idx_B需要递增1

另外,由于idx_B发生改变,我们需要考虑S区中栈顶的车辆是否能够驶入B区。若可以驶入,即stack[-1] == B_list[idx_B],则栈顶元素弹出且idx_B继续递增。上述过程需要在while循环中进行。

在这里插入图片描述

代码

python

# 题目:【栈】美团2023春招-火车迷
# 作者:闭着眼睛学数理化
# 算法:栈
# 代码有看不懂的地方请直接在群上提问


# 用于计算每次询问的函数
def cal(n, A_list, B_list):
    # 初始化一个空栈
    stack = list()
    # 设置B_list中的索引idx_B,初始化为0
    # B_list[idx_B]表示当前B区需要驶入的火车
    idx_B = 0
    # 遍历A_list中的每一节火车A
    # A有两种选择:
    # 1. 驶入B区;2. 驶入s区
    for A in A_list:
        # 若此时A与B_list中待驶入的火车不相等
        # 则A需要驶入s区,等待后续操作
        if B_list[idx_B] != A:
            stack.append(A)
        # 若此时A与B_list中待驶入的火车相等
        # 则直接令A驶入B区
        if B_list[idx_B] == A:
            # idx_B递增,表示此时的A车已经驶入B区
            idx_B += 1
            # 接着需要检查栈顶元素stack[-1]是否和B_list[idx_B]相等
            # 若相等,则将stack[-1]的元素驶入B区
            while stack and idx_B < n and stack[-1] == B_list[idx_B]:
                stack.pop()
                idx_B += 1
    # 如果最终stack为空,则说明所有火车都能够顺利进入B区,返回"Yes";否则返回False
    # 这里的判断使用idx_B == n也是可以的
    return "Yes" if len(stack) == 0 else "No"


# 输入询问次数
T = int(input())
ans = list()

# 询问T次
for _ in range(T):
    # 分别输入三行
    n = int(input())
    A_list = list(map(int, input().split()))
    B_list = list(map(int, input().split()))
    ans.append(cal(n, A_list, B_list))

for s in ans:
    print(s)

Java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        List<String> ans = new ArrayList<>();

        for (int t = 0; t < T; t++) {
            int n = scanner.nextInt();
            int[] A_list = new int[n];
            int[] B_list = new int[n];

            for (int i = 0; i < n; i++) {
                A_list[i] = scanner.nextInt();
            }
            for (int i = 0; i < n; i++) {
                B_list[i] = scanner.nextInt();
            }

            ans.add(cal(n, A_list, B_list));
        }

        for (String s : ans) {
            System.out.println(s);
        }
    }

    static String cal(int n, int[] A_list, int[] B_list) {
        List<Integer> stack = new ArrayList<>();
        int idx_B = 0;

        for (int A : A_list) {
            if (B_list[idx_B] != A) {
                stack.add(A);
            }
            if (B_list[idx_B] == A) {
                idx_B++;

                while (!stack.isEmpty() && idx_B < n && stack.get(stack.size() - 1) == B_list[idx_B]) {
                    stack.remove(stack.size() - 1);
                    idx_B++;
                }
            }
        }

        return stack.isEmpty() ? "Yes" : "No";
    }
}

C++

#include <iostream>
#include <vector>

using namespace std;

string cal(int n, vector<int> &A_list, vector<int> &B_list) {
    vector<int> stack;
    int idx_B = 0;

    for (int A : A_list) {
        if (B_list[idx_B] != A) {
            stack.push_back(A);
        }
        if (B_list[idx_B] == A) {
            idx_B++;

            while (!stack.empty() && idx_B < n && stack.back() == B_list[idx_B]) {
                stack.pop_back();
                idx_B++;
            }
        }
    }

    return stack.empty() ? "Yes" : "No";
}

int main() {
    int T;
    cin >> T;
    vector<string> ans;

    for (int t = 0; t < T; t++) {
        int n;
        cin >> n;
        vector<int> A_list(n), B_list(n);

        for (int i = 0; i < n; i++) {
            cin >> A_list[i];
        }
        for (int i = 0; i < n; i++) {
            cin >> B_list[i];
        }

        ans.push_back(cal(n, A_list, B_list));
    }

    for (string s : ans) {
        cout << s << endl;
    }

    return 0;
}

时空复杂度

时间复杂度:O(Nt)。每一个元素仅需进出栈一次。t为询问次数。

空间复杂度:O(N)。栈所占空间,每次询问后重置。


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1069486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++学习 -- Base64算法

Base64算法概述 Base64是一种用于将二进制数据表示为ASCII字符集中的可打印字符的编码方法。它由64个不同的字符组成&#xff0c;通常包括26个大写字母、26个小写字母、10个数字以及两个特殊字符&#xff08;通常是""和"/"&#xff09;。Base64编码的目的…

【Vue基础-数字大屏】地图标记涟漪效果设置

一、需求说明 将地图中北京市、陕西市、南宁市分别以实心圆、涟漪圆、涟漪圆标记出来 二、代码实践 涉及三个文件 1、App.vue: <template><Screen1/> </template> <script> import Screen1 from "./components/Screen1.vue"; export def…

如何应对数据安全四大挑战?亚马逊云科技打出“组合拳”

数字经济时代&#xff0c;数据被公认为继土地、劳动力、资本、 技术之后的又一重要生产要素。对于企业而言&#xff0c;数据则是一切创新与关键决策的根源。 然而&#xff0c;企业在发挥数据资产的商业价值方面&#xff0c;却面临诸多挑战&#xff0c;比如敏感数据识别、跨组织…

【高阶数据结构】图详解第一篇:图的基本概念及其存储结构(邻接矩阵和邻接表)

文章目录 1. 图的基本概念1.1 什么是图1.2 有向图和无向图1.3 完全图1.4 邻接顶点1.5 顶点的度1.6 路径1.7 路径长度1.8 简单路径与回路1.9 子图1.10 连通图1.11 强连通图1.12 生成树 2. 图的存储结构2.1 邻接矩阵2.2 邻接矩阵代码实现结构定义构造函数添加边打印图测试 2.3 邻…

leetCode 718.最长重复子数组 动态规划 + 优化(滚动数组)

718. 最长重复子数组 - 力扣&#xff08;LeetCode&#xff09; 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&…

2023年台州市第三届网络安全技能大赛(MISC)这是神马

这是神马 考点&#xff1a;冰蝎流量特征数据包&#xff0c;需要解密 emoj解密 冰蝎之前做过 特征就是先base64编码在AES编码 我们在数据包里面找到了密钥&#xff1a;144a6b2296333602 这里我们知道了密钥我们就去解密 先筛选HTTP协议 导出HTTP数据流可以看到传了shell.php 随…

美容美甲小程序商城的作用是什么

美容院往往有很高需求&#xff0c;女性悦己经济崛起&#xff0c;加之爱美化程度提升&#xff0c;无论线下环境还是线上互联网信息冲击&#xff0c;美容服务、化妆产品等市场规格一直稳增不减。 通过【雨科】平台制作美容美甲商城&#xff0c;售卖相关服务/产品&#xff0c;模块…

记两次内网入侵溯源

1.1、入侵告警 1、某天深夜主机防护突然爆出CS木马后门&#xff0c;这攻击队不讲武德呀&#xff0c;还好没睡着2、赶紧叫醒旁边看流量设备的哥们儿&#xff0c;尝试Shiro 反序列漏洞攻击成功3、测试目标网站存在shiro反序列化漏洞1.2、上机排查 1、上机将CS木马下载下来&…

Vue3 reactive和ref详解

reactive Vue3.0中的reactive reactive 是 Vue3 中提供的实现响应式数据的方法。在 Vue2 中响应式数据是通过 defineProperty 来实现的&#xff0c;在 Vue3 中响应式数据是通过 ES6 的 Proxy来实现的。reactive 参数必须是对象 (json / arr)如果给 reactive 传递了其它对象 默…

基于JavaWeb的家用电器信息管理系统

本系统采用基于JAVA语言实现、架构模式选择B/S架构&#xff0c;Tomcat7.0及以上作为运行服务器支持&#xff0c;基于JAVA等主要技术和框架设计&#xff0c;idea作为开发环境&#xff0c;数据库采用MYSQL5.7以上。 开发环境&#xff1a; JDK版本&#xff1a;JDK1.8 服务器&…

intel深度相机 D455及D4系列入门教程(逐行代码讲解)

1.介绍 Intel RealSense D435、D455等D4系列&#xff1a; Intel D4系列深度相机是由英特尔&#xff08;Intel&#xff09;公司推出的一款深度感知摄像头&#xff0c;专为实现计算机视觉和深度学习应用而设计。这款相机使用了英特尔的深度感知技术&#xff0c;结合了摄像头和红…

三极管及继电器的使用(单片机如何控制灯泡等大型电器)

1.对于初入硬件的小伙伴一定会用到三极管和继电器&#xff0c;如下图&#xff08;三极管&#xff09; 如下图&#xff08;继电器&#xff09; 当然上述三极管和继电器&#xff0c;只是众多的其中一种&#xff0c;而且继电器是包装好了的&#xff0c;这个应该叫继电器模块&#…

opencv图像的直方图,二维直方图,直方图均衡化

文章目录 opencv图像的直方图&#xff0c;二维直方图&#xff0c;直方图均衡化一、图像的直方图1、什么是图像的直方图&#xff1a;2、直方图的作用&#xff1a;3、如何绘制图像的直方图&#xff1a;&#xff08;1&#xff09;cv::calcHist()函数原型&#xff1a;&#xff08;2…

土地证、工程规划许可证、建设用地规划许可证

土地证、工程规划许可证、建设用地规划许可证办理是房地产开发最基础和初开始的工作流程。 一、土地证是简称&#xff0c;全称为《中华人民共和国国有土地使用证》&#xff0c;发证部门是当地国有土地资源局。 申办单位经当地规划部门审批通过某项目备案审批&#xff0c;在办理…

想要精通算法和SQL的成长之路 - 简化路径

想要精通算法和SQL的成长之路 - 简化路径 前言一. 简化路径 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 简化路径 原题连接 思路如下&#xff1a; 我们根据 "/" 去拆分字符串&#xff0c;得到每个子目录。这里拿到的子目录可能是空字符串&#xff0c;需要…

【Vue2.0源码学习】生命周期篇-销毁阶段(destroy)

文章目录 1. 前言2. 销毁阶段分析3. 总结 1. 前言 接下来到了生命周期流程的最后一个阶段——销毁阶段。从官方文档给出的生命周期流程图中可以看到&#xff0c;当调用了vm.$destroy方法&#xff0c;Vue实例就进入了销毁阶段&#xff0c;该阶段所做的主要工作是将当前的Vue实例…

buuctf PWN warmup_csaw_2016

下载附件&#xff0c;IDA查看 发现直接有显示flag函数 int sub_40060D() {return system("cat flag.txt"); }查看程序起始地址0x40060D ; Attributes: bp-based framesub_40060D proc near ; __unwind { push rbp mov rbp, rsp mov edi, offset comman…

Vue中如何进行音视频录制与视频剪辑

在Vue中进行音视频录制与视频剪辑 随着互联网的发展&#xff0c;音视频处理已经成为前端开发中一个越来越重要的领域。Vue.js作为一款流行的前端框架&#xff0c;为我们提供了丰富的工具和生态系统&#xff0c;使得音视频录制和编辑变得更加容易。本文将介绍如何在Vue中进行音…

SpringMVC修炼之旅(1)什么是SpringMVC

一、什么是MVC 1.1概述 MVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设计规范。 是将业务逻辑、数据、显示分离的方法来组织代码。 MVC主要作用是降低了视图与业务逻辑间的双向偶合。 MVC不是一种设计模式&#xff0c;MVC是一种架构模式…

[Android]问题解决-Device must be bootloader unlocked

现象 在push文件时&#xff0c;remount命令发生如下报错&#xff1a; $ adb remount Device must be bootloader unlocked解决 1. 打开 开发者模式中的OEM unlocking开关 2. fastboot unlock设置 adb reboot bootloader fastboot flashing unlock根据屏幕提示&#xff0c;…