队列结构题目

这篇博客介绍了三个数据结构的应用:动物收容所的管理,计算购票所需时间,以及实时请求计数。动物收容所类使用队列实现猫和狗的入队和出队操作;时间RequiredToBuy方法展示了如何在队列中查找特定元素的效率;RecentCounter类用于记录最近的请求,而MovingAverage类则实现了数据流中的移动平均值计算。这些实例展示了队列在处理实时数据和高效操作中的作用。
摘要由CSDN通过智能技术生成


动物收容所


在这里插入图片描述
在这里插入图片描述

class AnimalShelf {
    public Queue<Integer>dog;
    public Queue<Integer>cat;
    public AnimalShelf() {
        dog=new LinkedList<>();
        cat=new LinkedList<>();
    }
    
    public void enqueue(int[] animal) {
        if(animal[1]==0){//猫
            cat.add(animal[0]);
        }else{//狗
            dog.add(animal[0]);
        }
    }
    
    public int[] dequeueAny() {
        if(dog.isEmpty()&&cat.isEmpty()){
            return new int[]{-1,-1};
        }
        if(dog.isEmpty()){
            return new int[]{cat.poll(),0};
        }
        if(cat.isEmpty()){
            return new int[]{dog.poll(),1};
        }
        if(dog.peek()<cat.peek()){
            return new int[]{dog.poll(),1};
        }
        return new int[]{cat.poll(),0};
        
    }
    
    public int[] dequeueDog() {
        return dog.isEmpty()?new int[]{-1,-1}:new int[]{dog.poll(),1};
    }
    
    public int[] dequeueCat() {
        return cat.isEmpty()?new int[]{-1,-1}:new int[]{cat.poll(),0};
    }
}

/**
 * Your AnimalShelf object will be instantiated and called as such:
 * AnimalShelf obj = new AnimalShelf();
 * obj.enqueue(animal);
 * int[] param_2 = obj.dequeueAny();
 * int[] param_3 = obj.dequeueDog();
 * int[] param_4 = obj.dequeueCat();
 */

在这里插入图片描述



买票需要的时间


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
    public int timeRequiredToBuy(int[] tickets, int k) {
        int ans=0;
        Queue<Integer>q=new LinkedList<>();
        for(int i=0;i<tickets.length;++i){
            q.add(i);
        }
        while(!q.isEmpty()){
            if(tickets[k]==0){
                break;
            }
            int index=q.poll();
            if(tickets[index]>0){
                ans++;
                tickets[index]--;
                q.add(index);
            }
        }
        return ans;
    }
}

在这里插入图片描述



最近的请求次数


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class RecentCounter {
    Queue<Integer>q;
    public RecentCounter() {
        q=new LinkedList<>();
    }
    
    public int ping(int t) {
        if(q.isEmpty()||t-3000<=q.peek()){
            q.add(t);
            return q.size();
        }
        while(!q.isEmpty()&&t-3000>q.peek()){
            q.poll();
        }
        q.add(t);
        return q.size();
    }
}

/**
 * Your RecentCounter object will be instantiated and called as such:
 * RecentCounter obj = new RecentCounter();
 * int param_1 = obj.ping(t);
 */

在这里插入图片描述



数据流中的移动平均值


在这里插入图片描述

在这里插入图片描述

class MovingAverage {
    public Queue<Integer>q;
    int size;
    int sum;
    public MovingAverage(int size) {
        q=new LinkedList<>();
        this.size=size;
        sum=0;
    }
    
    public double next(int val) {
        if(q.size()<size){
            sum+=val;
            q.add(val);
            return sum*1.0/q.size();
        }
        //q.size()==size
        sum-=q.poll();
        sum+=val;
        q.add(val);
        return sum*1.0/size;
    }
}

/**
 * Your MovingAverage object will be instantiated and called as such:
 * MovingAverage obj = new MovingAverage(size);
 * double param_1 = obj.next(val);
 */

在这里插入图片描述



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值