虽然最近中日关系不友好,但是去笔试一下也没啥嘛,为了我大中华!
嗯,我也没有收到其关于不得泄题的通知。
一下是题,要求实现两个接口,实现要求:运行速度快,每个操作时间复杂度不能相差太大。
一,实现Immutable的FIFO队列。也就是说要求入队和出队不会改变原来的队列。
package jp.co.worksap.recruiting;
public interface ExamImmutableQueue<E> {
public ExamImmutableQueue<E> enqueue(E e);
public ExamImmutableQueue<E> dequeue();
public E peek();
public int size();
}
二,实现可以查找最大、最小和中间值的FIFO队列。
public interface ExamPeekableQueue<E extends Comparable<E>> {
public void enqueue(E e);
public E dequeue();
public E peekMedian();
public E peekMaximum();
public E peekMinimum();
public int size();
}
自己的实现:
一:这个真不太明白怎么优化,也不太清楚会出什么问题。
做了这个才知道为什么一直说LISP之类效率低下。。。那些巨巨们怎么做到优化的!
package jp.co.worksap.recruiting;
import java.lang.reflect.Array;
import java.util.NoSuchElementException;
public class ExamImmutableQueueImpl<E> implements ExamImmutableQueue<E> {
private final E[] queue;
private final int size;
public ExamImmutableQueueImpl() {
queue = null;
size = 0;
}
private ExamImmutableQueueImpl(E[] queue) {
this.queue = queue;
this.size = queue.length;
}
@Override
public ExamImmutableQueue<E> enqueue(E e) {
// TODO Auto-generated method stub
if (e == null)
throw new IllegalArgumentException();
E[] clone = (E[]) Array.newInstance(e.getClass(), size + 1);
clone[0] = e;
if (size != 0)
System.arraycopy(this.queue, 0, clone, 1, size);
return new ExamImmutableQueueImpl<E>(clone);
}
@Override
public ExamImmutableQueue<E> dequeue() {
// TODO Auto-generated method stub
if (this.size == 0)
throw new NoSuchElementException();
E[] clone = (E[]) new Object[size - 1];
// clone.remove(0);
System.arraycopy(this.queue, 0, clone, 0, size-1);
return new ExamImmutableQueueImpl<E>(clone);
}
@Override
public E peek() {
// TODO Auto-generated method stub
if (size == 0)
throw new NoSuchElementException();
return (E) queue[size - 1];
}
@Override
public int size() {
// TODO Auto-generated method stub
return this.size;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
二:可能用自平衡二叉排序树拓展一下head和tail会比较好?
Java里的sort对对象是归并排序,似乎在这里可以进行优化。
package jp.co.worksap.recruiting;
import java.util.Collections;
import java.util.LinkedList;
import java.util.NoSuchElementException;
public class ExamPeekableQueueImpl<E extends Comparable<E>> implements
ExamPeekableQueue<E> {
private LinkedList<SortedNode> objList = new LinkedList<SortedNode>();
private SortedNode head = null;
private SortedNode tail = null;
class SortedNode implements Comparable<SortedNode>{
public E e;
public SortedNode next;
public SortedNode(E e, SortedNode sn) {
this.e = e;
next = sn;
}
@Override
public int compareTo(SortedNode sn) {
// TODO Auto-generated method stub
return this.e.compareTo(sn.e);
}
}
private void testNull() {
if (objList.isEmpty()) {
head = null;
tail = null;
throw new NoSuchElementException("No element");
}
}
@Override
public void enqueue(E e) {
// TODO Auto-generated method stub
if (e == null)
throw new NoSuchElementException("Null object to eunqueue");
if (head == null) {
SortedNode sn = new SortedNode(e, null);
head = sn;
tail = sn;
objList.add(sn);
}
else {
SortedNode sn = new SortedNode(e, null);
tail.next = sn;
tail = sn;
objList.add(sn);
Collections.sort(objList);
}
}
@Override
public E dequeue() {
// TODO Auto-generated method stub
testNull();
SortedNode sn = head;
head = head.next;
objList.remove(sn);
Collections.sort(objList);
return sn.e;
}
@Override
public E peekMedian() {
// TODO Auto-generated method stub
testNull();
return objList.get(objList.size()/2).e;
}
@Override
public E peekMaximum() {
// TODO Auto-generated method stub
testNull();
return objList.getLast().e;
}
@Override
public E peekMinimum() {
// TODO Auto-generated method stub
testNull();
return objList.getFirst().e;
}
@Override
public int size() {
// TODO Auto-generated method stub
return objList.size();
}
}