考察点:LFU Cache
public class LFUCache {
private class Node{
int value;
ArrayList<Integer> set;
Node prev;
Node next;
public Node (int value ){
this.value = value;
this.set = new ArrayList<Integer> ();
this.prev = null;
this.next = null;
}
}
private class item{
int key;
int value;
Node parent ;
public item(int key ,int value, Node parent){
this.key = key ;
this.value = value;
this.parent = parent;
}
}
private HashMap<Integer, item> map;
private Node head,tail;
private int capacity;
// @param capacity, an integer
public LFUCache(int capacity) {
// Write your code here
this.capacity = capacity;
this.map = new HashMap <Integer,item> ();
this.head = new Node (0);
this.tail = new Node(Integer.MAX_VALUE);
head.next = tail;
tail.prev = head;
}
// @param key, an integer
// @param value, an integer
// @return nothing
public void set(int key, int value) {
// Write your code here
if (get(key) != -1 ) {
map.get(key).value = value;
return ;
}
if (map.size() == capacity ){
getLFUitem();
}
Node newpar = head.next;
if ( newpar.value != 1){
newpar = getNewNode(1,head,newpar);
}
item curitem = new item(key,value,newpar);
map.put(key,curitem);
newpar.set.add(key);
return;
}
public int get(int key) {
// Write your code here
if (!map.containsKey(key)){
return -1;
}
item cur = map.get(key);
Node curpar = cur.parent;
if (curpar.next.value == curpar.value + 1){
cur.parent= curpar.next;
cur.parent.set.add(key);
}else{
Node newpar =getNewNode(curpar.value + 1,curpar,curpar.next);
cur.parent = newpar;
newpar.set.add(key);
}
curpar.set.remove(new Integer(key));
if(curpar.set.isEmpty()){
deleteNode(curpar);
}
return cur.value;
}
private Node getNewNode (int value ,Node prev , Node next){
Node temp = new Node(value);
temp.prev = prev;
temp.next = next;
prev.next = temp;
next.prev = temp;
return temp;
}
private void deleteNode(Node temp){
temp.prev.next = temp.next;
temp.next.prev = temp.prev;
return ;
}
private void getLFUitem(){
Node temp = head.next;
int LFUkey = temp.set.get(0);
temp.set.remove(0);
map.remove(LFUkey);
if (temp.set.isEmpty()){
deleteNode(temp);
}
return;
}
本文向大家介绍请你讲讲LRU算法的实现原理?相关面试题,主要包含被问及请你讲讲LRU算法的实现原理?时的应答技巧和注意事项,需要的朋友参考一下 考察点:LRU算法 ①LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也很高”,反过来说“如果数据最近这段时间一直都没有访问,那么将来被访问
本文向大家介绍请你讲讲wait方法的底层原理相关面试题,主要包含被问及请你讲讲wait方法的底层原理时的应答技巧和注意事项,需要的朋友参考一下 考察点:基础 ObjectSynchronizer::wait方法通过object的对象中找到ObjectMonitor对象调用方法 void ObjectMonitor::wait(jlong millis, bool interruptible, TR
本文向大家介绍请你讲讲&和&&的区别?相关面试题,主要包含被问及请你讲讲&和&&的区别?时的应答技巧和注意事项,需要的朋友参考一下 考察点:运算符 &运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右
本文向大家介绍请你讲讲http1.1和1.0的区别相关面试题,主要包含被问及请你讲讲http1.1和1.0的区别时的应答技巧和注意事项,需要的朋友参考一下 考察点:http 主要区别主要体现在: 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Un
本文向大家介绍请你讲讲什么是泛型?相关面试题,主要包含被问及请你讲讲什么是泛型?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA泛型 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时
本文向大家介绍请讲讲,你如何看待加班?相关面试题,主要包含被问及请讲讲,你如何看待加班?时的应答技巧和注意事项,需要的朋友参考一下