Works Applications的笔试题

4 篇文章 0 订阅
2 篇文章 0 订阅

虽然最近中日关系不友好,但是去笔试一下也没啥嘛,为了我大中华!


嗯,我也没有收到其关于不得泄题的通知。


一下是题,要求实现两个接口,实现要求:运行速度快,每个操作时间复杂度不能相差太大。


一,实现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();
	}

}


路过的看官,求优化指南。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值