思路:
用一个map实现get和set的功能
用一个LinkedList<string> array实现最少访问节点删除的功能,根据题目只要求最常访问和最少访问,因此根据访问顺序将节点插入到LinkedList中,list越靠前为越少访问的。
用一个ArrayList<integer> ret实现保存get()的结果,由于需要返回int[]数组,需要进行ArrayList<integer>到int[]的转换</integer></integer></string>
ret.stream().mapToInt(Integer::valueOf).toArray();
整体逻辑:
如果是插入操作:
判断array.size()是否小于k,
如果小于k,
将键插入到array中,
否则
从array中删除第一个元素,将键插入到array中,map中调用set方法存放键值对
如果是查询操作:
从map中获取数据,如果为空,ret.add(-1),否则ret.add(data),并更新array
import java.util.*;
public class Solution {
/**
* lru design
* @param operators int整型二维数组 the ops
* @param k int整型 the k
* @return int整型一维数组
*/
//思路
public static int[] LRU (int[][] operators, int k) {
// write code here
Map<String,Integer>map=new HashMap<>();
LinkedList<String> array=new LinkedList();
ArrayList<Integer> ret=new ArrayList();
for(int i=0;i<operators.length;i++){
// set数据
// System.out.println("operators[i][0]"+operators[i][0]);
if(operators[i][0]==1){
// 添加数据
// 没有数据
// if(map.get(String.valueOf(operators[i][1]))==null){
if(array.size()<k){
array.add(String.valueOf(operators[i][1]));
}else{
map.remove(array.get(0));
array.removeFirst();
array.addLast(String.valueOf(operators[i][1]));
}
map.put(String.valueOf(operators[i][1]),operators[i][2]);
// read数据
}else{
Integer data=map.get(String.valueOf(operators[i][1]));
if(data==null){
ret.add(-1);
continue;
}
// 获取当前访问的索引
int index=array.indexOf(String.valueOf(operators[i][1]));
// 更新访问的列表
String readnow=array.get(index);
array.remove(index);
array.addLast(readnow);
// 添加数据到返回列表
ret.add(data);
}
}
return ret.stream().mapToInt(Integer::valueOf).toArray();
}
}
京公网安备 11010502036488号