Airbnb 电面

一直提不起来精神准备面试,推了2个月实在不好意思继续推了就裸面了。国人小哥非常友好,说公司规定面试前不能谈candidate的背景,以防产生偏见。 但是面试进行得比较快,所以剩了半个小时,聊了一下彼此的项目,虽然不知道结果如何,整体感觉对于老码农还是很友善的。祝大家都能顺利通过面试

// Build a queue class with the enqueue and dequeue methods. The queue can store an *UNLIMITED* number of elements but you are limited to using arrays that can store up to 5 elements max.

// 1. Dequeue 1, will throw exception
// 2. Enqueue 1, Dequeue 1 time
// 3. Enqueue 7, Dequeue 7 times
// 4. Enqueue 7, Dequeue 8 times, will throw exception
// 5. Enqueue 4, Dequeue 4 times
// 6. Enqueue 5, Dequeue 5 times
// 7. Enqueue 4, Dequeue 4 times, Enqueue 1, Dequeue 1 time
// 8. Enqueue 5, Dequeue 5 times, Enqueue 3, Dequeue 3 times
// 9. Enqueue 7, Dequeue 3 times, Enqueue 3, Dequeue 8 times, will throw exception
import java.io.*;
import java.util.*;
/* * To execute Java, please define "static void main" on a class * named Solution. 
* * If you need more classes, simply define them inline. 
*/
class Solution {
  private static final int BUCKET_SIZE = 5; 
  private int header;  
  private int tail;  
  private LinkedList<Integer[]> data;

  public Solution() {    
     data = new LinkedList<>();  
  }

  public boolean enqueue(int element) {    
     if(data.size() == 0) {      
        data.add(new Integer[BUCKET_SIZE]);    
     }    
     data.get(data.size() - 1)[tail] = element;    
     tail++;   
     if(tail >= BUCKET_SIZE) {      
         data.add(new Integer[BUCKET_SIZE]);      
         tail = 0;    
     }    
     return true;  
  }


  public int dequeue() throws IllegalArgumentException {    
     if(runOutElement()) {     
         throw new IllegalArgumentException();    
     }   
     int result = data.get(0)[header];    
     header++;   
     if(header >= BUCKET_SIZE) {      
        data.remove(0);      
        header = 0;   
     }    
     return result; 
  }
  
  private boolean runOutElement() {     
    if(data.size() == 0) {     
      return true;    
    }    
   if(data.size() == 1 && tail == 0) {      
      return true;    
   }   
   if(data.size() == 1 && tail == header) {      
      return true;    
   }    
   return false;  
  }

  public static void main(String[] args) {    
     Solution solution = new Solution();    
     for(int index = 0; index < 7; index++) {     
        solution.enqueue(index);    
     }   
     for(int index = 0; index < 3; index++) {      
        System.out.println(solution.dequeue());    
     }    
     for(int index = 0; index < 3; index++) {      
        solution.enqueue(index);    
     }    
     for(int index = 0; index < 8; index++) {      
      System.out.println(solution.dequeue());   
     }  
  }
}

谢谢楼主, 感觉下面这个代码可以少一个判断 header == tail 能包含 tail == 0 的情况

private boolean runOutElement() {
     if(data.size() == 0) {
      return true;
    }
    if(data.size() == 1 &amp;&amp; tail == header) {
      return true;
    }
    return false;
  }

恭喜你啊