Animal Shelter

 宠物收养所

思路:要使各项操作都为O(1),应该使用linkedHashMap(插入查找删除都是O(1),还记录了顺序关系)及两个队列。

public class AnimalShelter {
    
    ListNode head;
    ListNode tail;
    Queue<Integer> cat_indexs;
    Queue<Integer> dog_indexs;
    Map<Integer, ListNode> map;
    int count;
    
    public AnimalShelter() {
        // do initialize if necessary
        head = new ListNode(-1, "");
        tail = head;
        cat_indexs = new LinkedList<Integer>();
        dog_indexs = new LinkedList<Integer>();
        map = new HashMap<Integer, ListNode>();
    }

    /**
     * @param name a string
     * @param type an integer, 1 if Animal is dog or 0
     * @return void
     */
    void enqueue(String name, int type) {
        // Write your code here
        ListNode cur = new ListNode(count, name);
        cur.pre = tail;
        tail.next = cur;
        tail = cur;
        map.put(count, cur);
        if (type == 1) {
            dog_indexs.offer(count);
        } else {
            cat_indexs.offer(count);
        }
        count++;
    }

    public String dequeueAny() {
        // Write your code here
        ListNode del = head.next;
        head.next = del.next;
        
        if (del != tail) {
            del.next.pre = del.pre;
        } else {
             tail = del.pre;
        }
        map.remove(del.key);
        if ((!cat_indexs.isEmpty()) && cat_indexs.peek() == del.key) {
            cat_indexs.poll();
        } else {
            dog_indexs.poll();
        }
        return del.name;
    }

    public String dequeueDog() {
        // Write your code here
        int dog_key = dog_indexs.poll();
        ListNode dog = map.get(dog_key);
        map.remove(dog_key);
        dog.pre.next = dog.next;
        if (dog != tail) {
            dog.next.pre = dog.pre;
        } else {
             tail = dog.pre;
        }
         
        return dog.name; 
        
    }

    public String dequeueCat() {
        // Write your code here
        int cat_key = cat_indexs.poll();
        ListNode cat = map.get(cat_key);
        map.remove(cat_key);
        cat.pre.next = cat.next;
        if (cat != tail) {
            cat.next.pre = cat.pre;
        } else {
             tail = cat.pre;
        }
         
        return cat.name; 
    }
}

class ListNode {
    ListNode pre;
    ListNode next;
    int key;
    String name;
    ListNode(int key, String name) {
        this.key = key;
        this.name = name;
    }
}
View Code

相关文章:

  • 2021-07-14
  • 2022-02-07
  • 2021-05-28
  • 2021-12-15
  • 2022-01-16
  • 2022-01-05
  • 2021-09-27
猜你喜欢
  • 2021-08-14
  • 2022-12-23
  • 2021-11-01
  • 2021-11-27
  • 2021-12-13
  • 2021-11-05
相关资源
相似解决方案