有下文吗
点赞 1

相关推荐

01-10 21:01
门头沟学院 Java
比较经典的题目,如果之前没写过的可能需要想一番,首先实现缓存最先想到的就是hashmap,O1级别的查找速度很适合做缓存,然后就是要实现lru,参考redis的zset底层实现,zset也是使用了两个数据结构跳表+hashmap,使用跳表实现排序,我们这里也是使用双向链表实现lru功能,每次查询对应数据的时候就将数据移除重新加到头部,也就是更新使用频率,附上代码如下比较经典的题目,如果之前没写过的可能需要想一番,首先实现缓存最先想到的就是hashmap,O1级别的查找速度很适合做缓存,然后就是要实现lru,参考redis的zset底层实现,zset也是使用了两个数据结构跳表+hashmap,使用跳表实现排序,我们这里也是使用双向链表实现lru功能,每次查询对应数据的时候就将数据移除重新加到头部,也就是更新使用频率//通过自定义节点,hashmap,哨兵节点//删除时通过pre和next指针快速删除节点//添加时只操作头尾,通过哨兵节点快速添加节点class LRUCache {private class Node{//保留key,不然在删除尾结点的时候不能返回key让map也删除//而map又不知道尾结点是哪个int key,value;Node pre,next;Node(int key,int value){this.key=key;this.value=value;}Node(int key,int value,Node pre,Node next){this.key=key;this.value=value;this.pre=pre;this.next=next;}}private int capacity;//通过哨兵节点可以快速找到头结点和尾节点private Node dummy;//通过hashmap快速找到节点,通过节点pre指针和next指针快速实现删除private Map<Integer,Node> map=new HashMap();public LRUCache(int capacity) {this.capacity=capacity;//不能dummy=new Node(-1,-1,dummy,dummy)//这样会导致dummy的pre和next为nulldummy=new Node(-1,-1);dummy.pre=dummy;dummy.next=dummy;}public int get(int key) {if(!map.containsKey(key)) return -1;//如果存在,更新使用频率(加到头部)Node node=map.get(key);remove(node);addFirst(node);return node.value;}public void put(int key, int value) {Node node;if(!map.containsKey(key)){while(map.size()>=capacity){int removeKey=removeLast();map.remove(removeKey);}node=new Node(key,value);addFirst(node);}else{//否则更新数值重新加入node=map.get(key);node.value=value;remove(node);addFirst(node);}map.put(key,node);}public void remove(Node node){Node pre=node.pre;Node next=node.next;pre.next=next;next.pre=pre;}public int removeLast(){Node tail=dummy.pre;remove(tail);return tail.key;}public void addFirst(Node node){//通过哨兵结点快速找到头结点Node head=dummy.next;head.pre=node;node.next=head;dummy.next=node;node.pre=dummy;}}
查看1道真题和解析
点赞 评论 收藏
分享
01-01 17:03
已编辑
哈尔滨工程大学 C++
岗位是EDA软件开发两位面试官,没开摄像头,不过不知道为啥是两个,因为其实只有一位面试官在问૮₍ꐦ -᷅ ⤙ -᷄ ₎ა先是把笔试题拿出来拷打了一下笔试题是一道数学,一道bfs。第一题我面试官问有没有o(1)的做法,因为我没用着题面给的公式,还寻思着这公式干嘛使的😭然后开始八股1.c和c++的区别2.c和c++struct的区别3.如何理解面向对象4.虚函数5.构造函数和析构函数哪个应该声明为虚函数,为什么6.如果有了某个对象虚指针,如何取得这个对象的第二个虚函数,想答++,不知道对不对就闭嘴道歉了7.这是运行时多态,问了下静态多态8.知不知道template9.c++11新特性10.问智能指针,哪几种,为什么出现智能指针11.问了static_cast,只记得是类型转换用的更安全,底层是啥忘了于是闭嘴没说话怕深问12.问auto13.问迭代器相关,iterator++可以为什么+1不行,我真不知道面试官看我真不知道还进行了提示,运算符重载相关STL1.知道哪些容器2.map有序和无序的底层实现是什么3.set和map的区别4.unordered_set存储的数据多了之后元素是怎么分配到哈希桶中的,我真不知道我都不知道哈希桶的事😭算法:1.经典排序算法2.快排和归并的时间复杂度和空间复杂度,当时经历拷打已经神志不清了,空间复杂度竟然乱说了3.动态规划,01背包问题的dp方程4.图遍历,然后问最短路径算法,还想问最小生成树,看我应该不会说算了你就说最短路径算法,结果我忘了迪杰斯特拉这个名词😫对不起我真的好久没刷图的算法了工具相关:1.linux常用命令2.vim常用快捷键3.cmake 怎么发布为release版本4.git常用命令5.gdb常用命令反问得知他们偏算法,平时主要图用的比较多感受:面试官感觉很厉害,是我太菜了,我好多都只知道皮毛深入就不会了。不过面试官人很好捏,看我不会道歉都说没事没事然后想法换点简单的,感觉我都给他逗笑了。真是一场酣畅淋漓的面试,这么菜真是抱歉,我好好学习去了😭😭
查看26道真题和解析
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务