Ваш ответ использует ArrayList
вместо истинных массивов и, что еще хуже, использует неограниченный массив для добавления этих массивов. Я думаю, что интервьюеры ожидали, что вы внедрите односвязный список массивов из 5 элементов:
/**
* A singly-linked list node with an array; supports popping its 1st elements,
* and adding elements at the end, possibly by creating a new node
*/
public class ListNode {
final int MAX = 5;
private int contents[] = new int[MAX];
private int size = 0; // valid elements
private ListNode next = null;
private ListNode(ListNode next) {
this.next = next;
}
public boolean isEmpty() { return size == 0; }
public ListNode addLast(int value) {
ListNode next = this;
if (size == MAX) {
next = new ListNode(this);
}
next.contents[next.size ++] = value;
return next;
}
public int removeFirst() {
if (size == 0) {
throw new NoSuchElementException("empty queue");
}
int value = contents[0];
size --;
for (int i=1; i<size; i++) contents[i-1] = contents[i];
return value;
}
}
/**
* A simple queue on top of nodes that keep arrays of elements
*/
public class ListArrayQueue {
ListNode first = new ListNode();
ListNode last = first;
public void enqueue(int value) {
last = last.addLast(value);
}
public int dequeue() {
if (first.isEmpty() && first != last) {
first = first.next;
}
return first.removeFirst();
}
}
С точки зрения производительности это можно улучшить: вы можете избежать сохранения size
в каждом ListNode
, так как только 1-й и последний узлы могут быть не заполнены. Вы также можете избежать цикла в removeFirst
, но это повлечет за собой замену size
на firstIndex
и lastIndex
; который может быть снова перемещен в ListArrayQueue
для экономии места в каждом узле.
Если бы они попросили вас создать неограниченный массив из 5-элементных массивов, вам пришлось бы реализовать нечто подобное b-tree . Который, без удобных ссылок, было бы довольно трудно осуществить во время интервью.