题解 | #设计LRU缓存结构#
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
基于数组设计的LRUCache
- 优势
- 支持泛型
- 空间更少
代码
import java.util.*;
class LruCache<K, V> {
private int capacity;
private int size;
private K[] keys;
private V[] values;
private V nullValue;
public LruCache(int capacity, V nullValue) {
this.capacity = capacity;
this.size = 0;
keys = (K[]) new Object[capacity];
values = (V[]) new Object[capacity];
this.nullValue = nullValue;
}
V get(K k) {
int index = exist(k);
if (index > -1) {
emerge(index);
return values[size - 1];
}
return nullValue;
}
int exist(K k) {
for (int i = 0; i < size; i++) {
if (keys[i].equals(k)) {
return i;
}
}
return -1;
}
void set(K k, V v) {
//上浮
int index = exist(k);
if (index > -1) {
keys[index] = k;
values[index] = v;
emerge(index);
} else {
if (size < capacity) {
keys[size] = k;
values[size] = v;
size = size + 1 >= capacity ? capacity : size + 1;
} else {
emerge(0);
keys[size - 1] = k;
values[size - 1] = v;
}
}
}
void emerge(int index) {
assert index>=0:"index 要大于等于0";
V tempValue = values[index];
K tempKey = keys[index];
for (int i = index + 1; i < size ; i++) {
keys[i - 1] = keys[i];
values[i - 1] = values[i];
}
keys[size - 1] = tempKey;
values[size - 1] = tempValue;
}
}
public class Solution {
/**
* lru design
* @param operators int整型二维数组 the ops
* @param k int整型 the k
* @return int整型一维数组
*/
public int[] LRU(int[][] operators, int k) {
LruCache<Integer, Integer> lruCache = new LruCache<>(k, -1);
int size = 0;
for (int i = 0; i < operators.length; i++) {
if (operators[i][0] == 2) {
size++;
}
}
int[] result = new int[size];
int index = 0;
for (int i = 0; i < operators.length; i++) {
if (operators[i][0] == 1) {
lruCache.set(operators[i][1], operators[i][2]);
}
if (operators[i][0] == 2) {
result[index++] = lruCache.get(operators[i][1]);
}
}
return result;
// write code here
}
}
查看5道真题和解析