谁能帮我看看这个LRU算法哪错了,,我在牛客上面老是出问题

Never妥协 2021-03-04 12:36:58

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();
}
}



一直报
返回非零
请检查是否存在数组越界等非法访问情况
...全文
213 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2021-03-04
  • 打赏
  • 举报
回复
引用 楼主 Never妥协 的回复:

一直报
返回非零
请检查是否存在数组越界等非法访问情况
循环里加一个0的判断条件,不然一直死循环。 [code=java] public static void main(String[] args) { Scanner sc = new Scanner(System.in); Test10 lru = new Test10(sc.nextInt()); while (sc.hasNextLine()){ String str = sc.nextLine(); if(str.equals("0")) break; 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(); }

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧