网易互娱2020-9月22日笔试题记录

这篇博客记录了网易互娱2020年9月22日笔试的两道题目,分别是关于性能瓶颈的定位和海盗藏宝图问题的解决方案。在性能瓶颈题目中,通过维护任务栈和使用地图记录任务执行时长来找出耗时最长的任务。在海盗藏宝图问题中,模拟了藏宝图的共享、丢失和信息传递,以确定暴风雨后还能找到的宝藏。两题都已通过大部分或所有测试用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二题:性能瓶颈:(通过90%)

在单线程编程中经常会遇到性能瓶颈,在父任务中往会拥有多个子任务串行运行,子任务需要等待前一个任务完成才能获得资源运行,父任务则需要等待它当前持有的所有子任务完成才能继续进行它自身的计算,有时我们需要定位是代码中哪个部分消耗了最多的时间。时间(ms)

任务1包含了子任务2,子任务2又包含了其子任务3和4任务2自身的计算时间消耗1000-5-10-15=970秒。任务1自身的计算时间消耗2000-1-995=1004任务3,任务4消耗的时间分别为10与15。所以任务1消耗的时间是最长的。

思路如下:主要就是通过维护一个任务栈,子任务肯定是后开始先结束也就是后进栈先出栈,父任务肯定是先开始后结束也就是先进栈后出栈。具体逻辑如下:

1.输入遇到状态为0的任务(代表任务开始)就压栈,此时栈顶如果为空则代表改任务没有父任务,如果不为空则维护该任务为栈顶任务的子任务(用map),

2.碰到状态为1的任务(代表该任务结束)可以先判断该任务id与栈顶的任务id是否一致(如果不一致则说明是非法输入直接error结束),如果一致则直接出栈,并记录该任务的执行时长。

3.输入结束时,计算每个任务的真正执行时长并维护最大值即可(就是用记录的时常去减去所有子任务的执行时长即可,子任务已经在1过程种记录了)

4,还有很多要注意的判非(直接error的逻辑)逻辑需要自己思考,我代码中也有大部分了,但是应该还少一种...因为只通过了90%.

 


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Stack;

class Node{
    int t;
    int id;
    int flag;
    public Node(int t1,int i,int f){
        t=t1;
        id=i;
        flag=f;
    }
}
public class Main {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        if(n%2==1){
            System.out.println("error");
            return ;
        }

        Stack<Node> st=new Stack<>();
        HashMap<Integer, ArrayList<Integer>> Child=new HashMap<>();
        int[] record=new int[n+1];
        for(int i=0;i<n;i++){
            int t=sc.nextInt();
            int id=sc.nextInt();
            int flag=sc.nextInt();
            if(flag==1){
                if(st.empty()){
                    System.out.println("error");
                    return ;
                }
                Node top=st.pop();
                if(top.id!=id||top.flag!=0||top.t>t){
                    System.out.println("error");
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值