谁能帮我看看这个LRU算法哪错了,,我在牛客上面老是出问题
package cn.yangyt.lru;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
private final HashMap<Integer, Node> map = new HashMap<>();
private final Node head = new Node();
private final Node tail = new Node();
private final int capacity;
private int size;
public Main(int capacity) {
head.next = tail;
tail.pre = head;
this.capacity = capacity;
size = 0;
}
static class Node {
private int key;
private int value;
private Node pre;
private Node next;
public Node() {
}
public Node(int key, int value) {
this.key = key;
this.value = value;
}
}
//双向链表头插法。
private void addNode(Node node) {
Node originHead = head.next;
head.next = node;
node.pre = head;
node.next = originHead;
originHead.pre = node;
}
//双向链表删除某个节点
private void remove(Node node) {
Node next = node.next;
Node pre = node.pre;
pre.next = next;
next.pre = pre;
node.pre = null;
node.next = null;
}
public void put(int key, int value) {
Node node = map.get(key);
if (node == null) {
if (size < capacity) {
size++;
} else {
//删除链表尾节点
Node pre = tail.pre;
map.remove(pre.key);
remove(pre);
}
Node node1 = new Node(key, value);
addNode(node1);
map.put(key, node1);
} else {
//将链表中key的value更换
node.value = value;
map.put(key,node);
// node.value = value;
// remove(node);
// addNode(node);
}
}
public int get(int key) {
Node node = map.get(key);
if (node == null) {
return -1;
}
remove(node);
addNode(node);
return node.value;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Main lru = new Main(sc.nextInt());
while (sc.hasNextLine()){
String str = sc.nextLine();
String[] c = str.split(" ");
String m = c[0];
if("p".equals(m)){
lru.put(Integer.parseInt(c[1]),Integer.parseInt(c[2]));
}else if ("g".equals(m)){
System.out.println(lru.get(Integer.parseInt(c[1])));
}
}
sc.close();
}
}
一直报
返回非零
请检查是否存在数组越界等非法访问情况
...全文
相关推荐
LRU算法 lru算法
总结一下,LRU算法是一种根据最近最少使用原则进行页面替换的策略,常用于解决内存不足时的数据管理问题。它通过链表和哈希表等数据结构实现,能有效提高数据访问效率。
【牛客算法】某司面试算法题:设计LRU缓存结构
HashMap作为缓存记录的快速查找结构,使得get和set操作在 O(1) 时间完成。双向链表维护 LRU 顺序,头部表示最近使用,尾部表示最久未使用。容量管理:当超出容量时,通过删除尾节点(最久未使用),并从map中移除。
c语言实现的LRU算法
在实际应用中,LRU算法广泛应用于数据库系统、操作系统、Web服务器的缓存管理等领域,以提高数据访问效率。通过理解这个C语言实现的LRU算法,你可以深入学习到如何结合数据结构和算法来解决实际问题。
lru算法C语言实现
最后打印出内存状态和缺页情况。#### 四、代码运行结果分析根据提供的代码,我们可以通过运行结果了解LRU算法的实际执行效果。运行结果会展示内存的状态变化以及最终的缺页数。
LRU算法 C++实现
LRU(Least Recently Used)算法是一种常用的页面替换算法,用于解决计算机内存有限而数据需求量大的问题。


Java SE
