读书人

一个编程题的几种算法比较解决办法

发布时间: 2012-09-20 09:36:51 作者: rapoo

一个编程题的几种算法比较
class HighArray
{
private long[] a; // ref to array a
private int nElems; // number of data items
//-----------------------
public HighArray(int max) // constructor
{
a = new long[max]; // create the array
nElems = 0; // no items yet
}
//-----------------------
public boolean find(long searchKey)
{ // find specified value
int j;
for(j=0; j<nElems; j++) // for each element,
if(a[j] == searchKey) // found item?
break; // exit loop before end
if(j == nElems) // gone to end?
return false; // yes, can't find it
else
return true; // no, found it
} // end find()
//-----------------------
public void insert(long value) // put element into array
{
a[nElems] = value; // insert it
nElems++; // increment size
}
//-----------------------
public boolean delete(long value)
{
int j;
for(j=0; j<nElems; j++) // look for it
if( value == a[j] )
break;
if(j==nElems) // can't find it
return false;
else // found it
{
for(int k=j; k<nElems; k++) // move higher ones down
a[k] = a[k+1];
nElems--; // decrement size
return true;
}
} // end delete()
//-----------------------
public void noDup() {
for(int i=0;i<nElems;i++) {
for(int j =i+1;j<nElems;j++) {
if(a[i]==a[j]) {
a[j] = -1;
}
}
}
for(int i=nElems-1; i>=0; i--) {
if(a[i] == -1)
delete(-1);
}
}
//-----------------------
public void display() // displays array contents
{
for(int j=0; j<nElems; j++) // for each element,
System.out.print(a[j] + " "); // display it
System.out.println("");
}
//-----------------------
} // end class HighArray
////////////////////////////////////////////////////////////////
class HighArrayApp
{
public static void main(String[] args)
{
int maxSize = 100; // array size
HighArray arr; // reference to array
arr = new HighArray(maxSize); // create the array

arr.insert(77); // insert 10 items
arr.insert(77);
arr.insert(44);
arr.insert(55);
arr.insert(22);
arr.insert(88);
arr.insert(11);
arr.insert(00);
arr.insert(66);
arr.insert(33);

arr.display(); // display items

int searchKey = 35; // search for item


if( arr.find(searchKey) )
System.out.println("Found " + searchKey);
else
System.out.println("Can't find " + searchKey);

arr.delete(00); // delete 3 items
arr.delete(55);
arr.delete(99);

arr.insert(55);
arr.insert(44);
arr.insert(44);
arr.insert(55);
arr.display();
arr.noDup();
arr.display(); // display items again
} // end main()
} // end class HighArrayApp

------------------------------------------

作业要求:向highArray.java程序(清单2.3)的HighArray类中加入一个noDup()的方法,使之可以将数组中的所有重复数据项删除.即如果数组中有三个数据项的关键字为17, noDup()方法将会删除其中的两个.不必考试保持数据项的顺序.一种方法是先用每一个数据项比较,并用null(或是一个不会用在真正的关键字中的特殊值)将重复的数据项覆盖掉。然后将所有的null删除,当然还要缩小数组的大小。
下面的noDup()是我的方法:
------------------------------------------------------
public void noDup() {
for(int i=0;i<nElems;i++) {
for(int j =i+1;j<nElems;j++) {
if(a[i]==a[j]) {
a[j] = -1;
}
}
}
for(int i=nElems-1; i>=0; i--) {
if(a[i] == -1)
delete(-1);
}
}

---------------------------------

还有一种是方法是这样的,麻烦大家比较下这2种方法有区别嘛,哪个比较好一些呢?


public void noDup(){

//标记部分

int nCount = 0; //标记计数器。

for(int i=0; i<nElems; i++)

for(int j=0; j<i; j++)

if(a[j] == a[i])

{

if(a[i] != -1) //排除特殊标记

{

a[i] = -1; //特殊标记,假设用户不会输入负值。

nCount++;

}

}

//调整部分

long[] b = new long[nElems - nCount];

int nLength = 0;

int nVariable = 0;//变数,根据-1值变化调整下标。

for(int i=0; i<nElems; i++){

if(a[i] != -1){

//文字常量,通过它计算实际数组下标,数组下标从0开始。

b[nElems - nCount - 1 + nVariable - i] = a[i];
nLength++;
}
else
nVariable++;
}

//赋值部份
nElems = nLength;
a = b;
}



[解决办法]
你的排重的方法时间复杂度是O(n^2),最后去重的时候,第一种方法要频繁的移动数组元素,从这个角度来说,第二种方法要好些。
[解决办法]
有意思!
顶起!
[解决办法]
其实你可以把数组中的数全部存到set里面去,因为set里面的元素是不能重复的,然后把它取出来放到数组中去.这样就不用判断了

Java code
public static void main(String[] args) {        Set<Long> set=new HashSet<Long>();        long[] a=new long[]{1,2,1,3,5,4,2};        for(int i=0;i<a.length;i++){            set.add(a[i]);        }        Iterator<Long> it=set.iterator();        for(int i=0;i<set.size();i++){            a[i]=it.next();            System.out.println(a[i]+" ");        }    } 

读书人网 >J2SE开发

热点推荐