美团3.25笔试记录-第一题

2023-05-16

第一题:

题目描述:

小美是一个火车迷。最近她在观察家附近火车站的火车驶入和驶出情况,发现火车驶入和驶出的顺序并不一致。经过小美调查发现,原来这个火车站里面有一个类似于栈的结构,如下图所示:例如可能1号火车驶入了火车站中的休息区s,在驶出之前2号火车驶入了。那么在这种情况下,1号火车需要等待2号火车倒车出去后才能出去(显然被后面驶入的2号火车挡住了,这个休息区s只有一个出入口)。出于好奇,小美统计了近些天的火车驶入驶出情况,开始统计和结束统计时休息区s中均是空的。由于中途疏忽,小美觉得自己好像弄错了几个驶入驶出顺序,想请你帮她验证一下。值得注意的是,小美虽然可能弄错了顺序,但对火车的记录是不重不漏的。形式化地来形容休息区s,我们视其为一个容量无限大的空间,假设两列火车 i 和 j 同时处于休息区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≤10,1≤n≤50000,1≤xi,yi≤n, 且{xn} 、{yn} 均为{1,2,3,…,n}的一个排列,即1~n这n个数在其中不重不漏恰好出现一次。

输出描述

对每组数据输出一行:如果小美记录的驶入和驶出顺序无法被满足则输出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

题解

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

/**
 * 第一题
 */
public class Test01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();//表示数据组数int
        String[] res = new String[T];
        for(int i = 0; i < T; i++){
            int n = sc.nextInt();//表示观察到的火车数量
            int[] pushed = new int[n];//火车入栈数组
            int[] popped = new int[n];//火车出栈数组
            for(int j = 0; j < n; j++){
                pushed[j] = sc.nextInt();
            }
            for(int k = 0; k < n; k++){
                popped[k] = sc.nextInt();
            }
            res[i] = judge(pushed, popped);
        }
        for(String s: res){
            System.out.println(s);
        }
    }

    public static String judge(int[] pushed,int[] popped){
        Deque<Integer> stack = new ArrayDeque<>();
        int n = pushed.length;
        for(int i = 0,j = 0;i < n;i++){
            stack.push(pushed[i]);
            while(!stack.isEmpty() && stack.peek() == popped[j]){
                stack.pop();
                j++;
            }
        }
        return stack.isEmpty() ? "Yes" : "No";
    }
}

思路

judge()方法是判断小美记录的火车驶出顺序是否满足出栈的顺序,与剑指 Offer 31. 栈的压入、弹出序列题目一致。

注:

1. 那么为什么我们不直接选择Stack,而是用Deque?

有两个主要原因:

  1. 从性能上来说应该使用Deque代替Stack。
    Stack和Vector都是线程安全的,其实多数情况下并不需要做到线程安全,因此没有必要使用Stack。毕竟保证线程安全需要上锁,有额外的系统开销。
  2. Stack从Vector继承是个历史遗留问题,JDK官方已建议优先使用Deque的实现类来代替Stack。
    Stack从Vector继承的一个副作用是,暴露了set/get方法,可以进行随机位置的访问,这与Stack只能从尾巴上进行增减的本意相悖。

此外,Deque在转成ArrayList或者stream的时候保持了“后进先出”的语义,而Stack因为是从Vector继承,没有这个语义。

Stack<Integer> stack = new Stack<>();
Deque<Integer> deque = new ArrayDeque<>();

stack.push(1);
stack.push(2);
deque.push(1);
deque.push(2);

System.out.println(new ArrayList<>(stack)); // [1,2]
List<Integer> list1 = stack.stream().collect(Collectors.toList());//[1,2]

// deque转成ArrayList或stream时保留了“后进先出”的语义
System.out.println(new ArrayList<>(deque)); // [2,1]
List<Integer> list2 = deque.stream().collect(Collectors.toList());//[2,1]

2. 那么我们应该使用ArrayDeque还是LinkedList 来new出对象?

ArrayDeque和LinkedList这两者底层,一个采用数组存储,一个采用链表存储;

  1. 数组存储,容量不够时需要扩容和数组拷贝,通常容量不会填满,会有空间浪费;

  2. 链表存储,每次push都需要new Node节点,并且node节点里面有prev和next成员,也会有额外的空间占用。

    总结:
    ArrayDeque会略胜一筹,不过差别通常可以忽略。经过性能对比,更倾向于使用ArrayDeque来表达Java中的栈功能。

参考文章:https://blog.csdn.net/qq_37509948/article/details/123022630

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

美团3.25笔试记录-第一题 的相关文章

随机推荐

  • PaddleHub OCR实现文字识别

    PaddleHub OCR实现文字识别 环境 paddlehub 61 61 1 8 3 paddleocr 61 61 1 0 1 paddlepaddle 61 61 1 8 5 Shapely 61 61 1 7 1 pip安装 pi
  • IDEA连接远程MongoDB数据库

    IDEA连接远程MongoDB数据库 环境 IntelliJ IDEA 2020 2 3 Ultimate Edition MongDB 4 2 1 阿里云MongoDB控制台 进入阿里云控制台 xff0c 选择MongDB实例列表 xff
  • 开发常用网站

    开发常用网站 开发工具 JetBrains VSCode SublimeText Web开发 微信小程序开发者文档 Node js boostrap HTML HTTP服务器 Nginx Tomcat Apache HTTP Server
  • 使用Idea创建项目的一种清晰思路

    1 打开Idea后 xff0c 选择File gt new gt project 2 选择空项目 3 将project命名为任意名称 xff0c 这里命名为Java Exercise xff0c 点Finish 4 弹出对话框 xff0c
  • Spring Boot搭建Web项目(MongoDB)

    Spring Boot搭建Web项目 环境 JDK 1 8 IntelliJ IDEA 2020 3 2 Ultimate Edition PyCharm 2020 2 4 Professional Edition Maven 3 6 bs
  • 银行家算法 C++描述

    银行家算法 C 43 43 描述 银行家算法 操作系统 银行家算法 实现代码 main cpp span class token macro property span class token directive keyword inclu
  • 三种修改windows系统MAC地址方法

    方法一 xff1a 使用windows控制面板修改 第一步 按win键 gt 输入 控制面板 并打开 第二步 打开 网络和共享中心 第三步 打开 更改适配器设置 第四步 右击 WLAN2 后点击属性 第五步 修改网络地址属性 点击配置 xf
  • 【操作系统实验】Linux环境下用进程实现生产者消费者问题——C语言完整代码+详细实验报告

    注意 代码在文末 xff0c 以下为详细实验报告 实验目的 以生产者和消费者问题为例 xff0c 学习并熟悉Linux下进程通信 同步机制的具体实现方法 xff0c 主要是了解并掌握信号量机制和共享内存的使用方法 xff0c 进一步熟悉Li
  • mariadb的源码安装

    xff08 1 xff09 登上mariadb的官方网站 2 选择下载mariadb server 3 下载10 2版本 4 找到源码安装方式 xff08 5 xff09 下载传输到主机上 6 准备编译环境 yum span class t
  • HTTP协议以及Apache的httpd配置

    HTTP协议 前言HTTP简介HTTP诞生HTTP版本历史HTTP 0 9HTTP 1 0HTTP 1 1HTTP 2 0 web资源HTTP工作流程HTTP报文报文语法格式method xff08 方法 xff09 status xff0
  • 狂神说Redis笔记,Redis【入门】就这一篇就够了!

    Redis学习笔记 视频链接 xff1a 狂神说Redis链接 1 Nosql概述 1 1 为什么要使用Nosql 1 单片机Mysql时代 90年代 xff0c 一个网站的访问量太大 xff0c 单个数据库完全够用 随着用户的增多 xff
  • manjaro一些常用软件,指令(持续更新中)

    manjaro使用很久了 xff0c 由于对linux的陌生和迷惑 xff0c 重装了很多很多很多次 xff0c 最近的系统大概是使用最久的一次 xff0c 也解决了很多以前的问题在此记录下 系统如下 xff1a 软件安装 换源 烂大街的教
  • 在开发板上安装gdb

    网上对于在开发板上安装gdb的教程大多都是将开发板的文件系统放在虚拟机主机上 xff0c 从而通过nfs挂载上去的 xff0c 主要是针对性能较差开发板 xff0c 本教程讲解的是如何在开发板上直接安装gdb 为什么不能直接将pc上交叉编译
  • Idea Intellij 远程开发调试

    一 背景 在构建MiniOB开发环境时需要Linux环境 xff0c 另外结合分布式系统 xff0c 利用较好的通信 xff0c 萌发了远程开发的想法 xff1b 实际上远程部署 开发在很久之前有过想法 xff08 大约刚开始学Spring
  • Java笔记(4)——方法重载和this关键字

    1 方法的重载 不能通过参数名去区分两个方法 不能通过返回值类型来区分两个方法 可以通过参数列表 xff1a 参数个数 xff0c 参数类型来区分 span class token keyword public span span clas
  • 基于 java+springboot 工资管理系统设计和实现

    博主介绍 xff1a 5年java开发经验 xff0c 专注Java开发 定制 远程 指导等 csdn特邀作者 专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例 500套 欢迎点赞 收藏 留言 文末获取源码联系方式 目
  • ubuntu 安装gcc 或g++ 时提示未发现软件包 gcc或g++

    问题 xff1a 安装gcc 或g 43 43 时提示未发现软件包 xff1f 1 这时 xff0c 只需更新apt get即可 xff0c 那么apt get是什么呢 xff1f apt get xff0c 是一条linux命令 xff0
  • ubuntu设置固定ip地址的方法

    ubuntu设置固定ip的方法 问题 xff1a 在连接虚拟机上的mysql数据库时 xff0c 发现连接不上了 检查了数据库的连接信息后 xff0c 发现并没有问题 xff0c 然后去虚拟机上查看ip地址 xff0c 发现是ip地址发生了
  • 在VMware Workstation中ubuntu屏幕小如何解决?-安装vm tools工具

    在VMware Workstation中ubuntu屏幕小如何解决 xff1f 安装vm tools工具 问题 xff1a 安装好ubuntu后 xff0c 开机后发现屏幕太小或没有占满全屏 xff0c 如下图所示 xff1a 解决 xff
  • 美团3.25笔试记录-第一题

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