题目
https://www.lintcode.com/problem/3710
设计一种类似队列的数据结构,该数据结构能将最近使用的元素移动到队列尾部。
实现 MRUQueue 类:
MRUQueue(int n):初始化队列,通过 [1,2,3,...,n] 构造 MRUQueue
fetch(int k):返回队列中第 k 个元素(索引从 1 开始),并将其移动到队列尾部
1≤k≤n≤2000
最多调用 2000 次 fetch()
样例
样例 1:
输入:
MRUQueue(8)
fetch(3)
fetch(5)
fetch(2)
fetch(5)
输出:
[3, 6, 2, 8]
解释:
MRUQueue m = new MRUQueue(8); // 初始化队列为 [1,2,3,4,5,6,7,8]
m.fetch(3); // 返回第3个元素(3)并移到队尾,队列为 [1,2,4,5,6,7,8,3]
m.fetch(5); // 返回第5个元素(6)并移到队尾,队列为 [1,2,4,5,7,8,3,6]
m.fetch(2); // 返回第2个元素(2)并移到队尾,队列为 [1,4,5,7,8,3,6,2]
m.fetch(5); // 返回第5个元素(8)并移到队尾,队列为 [1,4,5,7,3,6,2,8]
样例 2:
输入:
MRUQueue(8)
fetch(1)
fetch(1)
fetch(1)
fetch(1)
输出:
[1,2,3,4]
答案
public class MRUQueue {
LinkedList<Integer> ll;
public MRUQueue(int n) {
ll = new LinkedList<>();
for (int i = 0; i <=n ; i++) {
ll.add(i);
}
}
public int fetch(int k) {
int root = ll.get(k);
ll.set(k,null);
ll.add(root);
ll.remove(null);
return root;
}
}