首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

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

2012-09-20 
一个编程题的几种算法比较class HighArray{private long[] a// ref to array aprivate int nElems// num

一个编程题的几种算法比较
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]+" ");        }    } 

热点排行