中级农民
- 积分
- 132
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-9-27
- 最后登录
- 1970-1-1
|
- static class Node {
- Node prev;
- Node next;
- int key;
- Node(int key){
- this.key = key;
- this.prev = null;
- this.next = null;
- }
- }
- static int countMiss(int cap, int keys) {
- if(cap == 0){
- return keys.length;
- }
- if(keys == null || keys.length == 0){
- return 0;
- }
- HashMap<Integer, Node> map = new HashMap<Integer, Node>();
- Node head = new Node(-1);
- Node tail = new Node(-1);
- head.next = tail;
- tail.prev = head;
- int count = 0;
- for(Integer k: keys) {
- if(map.containsKey(k)){
- Node n = map.get(k);
- removeNode(n);
- }else{
- count++;
- if(map.size() >= cap) {
- Node n = head.next;
- removeNode(n);
- map.remove(n.key);
- }
- map.put(k, new Node(k));
- }
- addNode(map.get(k), tail);
- }
- return count;
- }
- private static void addNode(Node node, Node tail) {
- Node prev = tail.prev;
- prev.next = node;
- node.prev = prev;
- node.next = tail;
- tail.prev = node;
- }
- private static void removeNode(Node n) {
- Node prev = n.prev;
- Node next = n.next;
- prev.next = next;
- next.prev = prev;
- }
复制代码 |
|