2023转正实习笔试-火车迷

题目

  • 小美是一个火车迷。最近她在观察家附近火车站的火车驶入和驶出情况,发现火车驶入和驶出的顺序并不一致。经过小美调查发现,原来这个火车站里面有一个类似于栈的结构
  • 例如可能1号火车驶入了火车站中的休息区s,在驶出之前2号火车驶入了。那么在这种情况下,1号火车需要等待2号火车倒车出去后才能出去(显然被后面驶入的2号火车挡住了,这个休息区s只有一个出入口)。
  • 出于好奇,小美统计了近些天的火车驶入驶出情况,开始统计和结束统计时休息区s中均是空的。由于中途疏忽,小美觉得自己好像弄错了几个驶入驶出顺序,想请你帮她验证一下。值得注意的是,小美虽然可能弄错了顺序,但对火车的记录是不重不漏的。
  • 形式化地来形容休息区s,我们视其为一个容量无限大的空间,假设两列火车i和同时处于休息区s中,驶入时刻Tin满足Tin(i)<Tin(j),则驶出时间Tour必定满足Tout()>Tout(j),即,先进后出。

输入描述

  • 第一行一个整数T表示数据组数。 对每组测试而言: 第一行一个整数n,表示观察到的火车数量,

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

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

  • 1s<=T<=10,1<=n<=50000,1sxjyisn,且{xn1}、{yn}均为(1,2.3.…….N)的一个排列,即1~n这n个数在其中不重不漏恰好出现一次。

输出描述

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

代码

/**
 * @author lijiaqi
 * @version 1.0
 */
import java.util.*;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while(T > 0) {
            T--;
            int n = sc.nextInt();
            int[] in = new int[n];
            int[] out = new int[n];
            for (int i = 0; i < n; i++) {
                in[i] = sc.nextInt();
            }
            sc.nextLine();
            for (int i = 0; i < n; i++) {
                out[i] = sc.nextInt();
            }
            Deque<Integer> st = new ArrayDeque<>();
            int inIndex = 0;
            int outIndex = 0;
            while(true) {
                if(inIndex >= in.length) {//入队完毕
                    if(outIndex >= out.length || st.isEmpty()) {
                        System.out.println("Yes");
                        break;
                    }else if(st.peekFirst() != out[outIndex]) {
                        System.out.println("No");
                        break;
                    }else {
                        st.pop();
                        outIndex++;
                    }
                }else {
                    //入队
                    while (!st.isEmpty()&&st.peekFirst() == out[outIndex]) {
                        st.pop();
                        outIndex++;
                    }
                    st.push(in[inIndex++]);
                }
            }

        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值