用双哈希解决该问题

设计LRU缓存结构

http://www.nowcoder.com/questionTerminal/e3769a5f49894d49b871c09cadd13a61

import java.util.*;


public class Solution {
    /**
     * lru design
     * @param operators int整型二维数组 the ops
     * @param k int整型 the k
     * @return int整型一维数组
     */
  public int[] LRU (int[][] operators, int k) {
        // write code here
        Map<Integer,Integer> tempMap1 = new HashMap<Integer, Integer>();//存储key与value
        Map<Integer,Integer> tempMap2 = new HashMap<Integer, Integer>();//存储优先级
        ArrayList<Integer> array = new ArrayList<Integer>();

        for(int i = 0;i<operators.length;i++){
            if(operators[i][0]==1){
                tempMap1.put(operators[i][1],operators[i][2]);//存储key与对应的value
                tempMap2.put(operators[i][1],getMaxPriority(tempMap2)+1);//存储存贮key,然后赋值优先级,每次访问的时候,设置给当前最大优先级+1
                if(tempMap1.size()>k){
                    tempMap1.remove(getMin(tempMap2));//得到优先级最小的key并且删除
                }
            }if (operators[i][0]==2){
                tempMap2.put(operators[i][1],getMaxPriority(tempMap2)+1);//优先级在最大的基础上进行+1
                array.add(tempMap1.getOrDefault(operators[i][1],-1));//得到key所对应的value,如果不在就返回-1;


            }
        }

        int a[] = new int[array.size()];
        int index = 0;
        for(int num :array){
            a[index] = num;
            ++index;
        }
        return a;




    }

    public int getMaxPriority(Map<Integer, Integer> tempMap2) {
        if(tempMap2.size()==0){
            return 0;
        }
        int value = Integer.MIN_VALUE;
        for(int key :tempMap2.keySet()){
            if(tempMap2.get(key)>value){
                value = tempMap2.get(key);
            }
        }
        return value;


    }

    public  int getMin(Map<Integer,Integer> tempMap2){
        int value = Integer.MAX_VALUE ;int keyOfMin=0;
        for(int key :tempMap2.keySet()){
            if(tempMap2.get(key)<value){
                value = tempMap2.get(key);
                keyOfMin = key;
            }
        }

        return keyOfMin;



    }
}

tempMap1存储原来的key以及所对应的value,tempMap2存储key以及所对应的优先级。
1:对operators数组进行遍历,然后对tempMap1与tempMap2进行赋值初始化
/*注:我这里的设置优先级是每次访问一个key的时候最原本的tempMap2所对应的虽大优先级进行+1*/
2:在对tempMap1初始化后,如果operators[i][0]为1的时候我们这个时候需要去判断tempMap1的size(),如果此时大于k的话我们则需要对tempMap2的最小value进行查找,
然后返回最小value所对应的key,然后tempMap1根据key将Map里面存储的数据进行删除
3:operators[i][0]为2的时候,我们首先对tempMap1中key为operators[i][1]的优先级进行+1,然后在tempMap1中查找相关key对应的value,将其放如果到ArrayList中去
最后将ArrayList遍历放到数组中,将数组返回。
4最后时间复杂度o(n),空间复杂度o(n2);
 
  
 
全部评论

相关推荐

02-24 17:40
门头沟学院 Java
不愧是字节,面麻了给我...1、项目介绍2、Agent项目是实习项目还是个人项目?有没有上线?3、拷打实习4、大模型微调,你的训练数据集是如何构建的?数据量有多大?5、在构建数据集的过程中,遇到了哪些挑战?花了多长时间?6、你之前的实习经历偏后端工程,你未来的职业规划更倾向于纯后端开.发,还是希望从事与AI/大模型结合的工作?7、详细讲一下Golang中Channel的概念和作用,它是否是并发安.全的?8、Channel和传统的锁(Mutex)在实现并发控制时有什么区别?各自的适用场景是什么?9、讲一下GMP模型10、当P的本地队列为空或者不为空时,它会怎么去调度G(协程)?11、Redis支持哪些数据结构12、为什么Redis的速度这么快13、如何实现一个类似某宝搜索框的实时商品名称模糊搜索功能?14、实时输入联想与输入完成后点击搜索在技术实现上有什么本质区别?15、实时搜索通常使用什么网络协议(如WebSocket)?你了解或有使用过吗?讲一下16、请详细说明扫码登录的完整流程和背后发生的原理17、在微服务架构中,服务发现和负载均衡是如何实现的?18、服务注册中心(如Nacos,&nbsp;Consul)是如何工作的?服务实例如何注册和保活(如通过心跳机制)?19、讲一下Agent中的“长短期记忆”20、什么样的信息应该放在长期记忆,什么样的信息放在短期记忆?21、当对话轮数很多,上下文窗口不足时,有哪些处理策略?(如截断、压缩)22、如果要进行记忆压缩,通常有哪些方法?23、了解过Agent的设计范式吗?有哪些?24、你设计的Agent是怎么实现ReAct模式的?详细讲讲25、手撕:实现一个并发任务处理器:给定一个包含100个任务ID的列表,要求控制最.大并发数为3,模拟并发调用某个外部接口
等闲_:https://www.nowcoder.com/share/jump/469255111772017977737。原主的帖子在这里
查看24道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务