问题描述: 这是一道外企算法的面试题,前提是不允许使用util包中任何类,即任何集合类都不允许使用。 写出的算法效率越高,此题得分越高,大家可以试一下。题目是输入一串已经排序好的数组,输出消除重复数之后的数组。如:
输入{ 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5 };输出{ 1, 2, 3, 4, 5 };
算法实现1:
/**
* Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
* All rights reserved.
* Author: Jarg Yee <yeshaoting@gmail.com>
* http://jarg.iteye.com/
*/
/*
*
*/
public class Distinct2
{
public static void main(String[] args)
{
int[] arr = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5};
int[] arr2 = new int[arr.length];
System.out.print("结果集:");
int count = 0; //记录结果集中元素数
for(int i=0; i<arr.length; i++)
{
//第一次或者当前值不存在队列的情况
if(i==0 || arr2[count-1]!=arr[i])
{
System.out.print(arr[i] + "\t");
arr2[count++] = arr[i];
}
}
}
}
算法实现2:
/**
* Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
* All rights reserved.
* Author: Jarg Yee <yeshaoting@gmail.com>
* http://jarg.iteye.com/
*/
/*
* 消除重复数(已经排序好的数组)
* 采用队列的思想,将非重复的元素放入到队列中
* 记录所存元素开始和结束的索引,据此输出结果
*/
public class Distinct
{
private static int[] arr = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5};
private Queue q = new Queue();
//内部类 - 队列类
class Queue
{
int front = 0, rear = 0; //分别表示队首,队尾
int[] queue = new int[arr.length];
//判断队列是否为空
public boolean isEmpty()
{
if(rear-front == 0)
return true;
return false;
}
//出队(不判断队列是否为空)
public int deQueue()
{
return queue[front++];
}
//入队
public void enQueue(int element)
{
queue[rear++] = element;
}
//获取队尾元素
public int getQueueRear()
{
return queue[rear-1];
}
//输出队列元素
public void display()
{
System.out.print("结果集:");
for(int i=front; i<rear; i++)
{
System.out.print(deQueue() + "\t");
}
}
}
/** for debugging. */
public static void main(String[] args)
{
Distinct obj = new Distinct();
int current;
for(int i=0; i<arr.length; i++)
{
current = arr[i];
//第一次或者当前值不存在队列的情况
if(i==0 || obj.q.getQueueRear()!=current)
{
obj.q.enQueue(current);
}
}
obj.q.display();
}
}