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; } }