删除给定数组中的指定元素

来源:互联网 发布:mcs51单片机数据总线 编辑:程序博客网 时间:2024/06/10 10:45

  最近想起了一个题:删除一个给定数组中的指定元素,要删除后还是一个连续分布的数组,也就是删除过程中要做相邻移位。

曾经见到一个非常简洁的做法,不过怎么都想不起来了。自己做了一个,希望有兴趣的朋友能给出更好的做法。

以下是我自己的实现函数,对给定数组a[n],删除值为x的元素,返回值为删除后数组的长度。

int csa(int a[],int n,int x){ int i=0,j=0,k=0;        //i寻找不等于x的元素,j指向新数组结尾  while(a[i]!=x&&i<n) i++;  if(a[i]==x) j=i;        //找到第一个x位置  while(i<n)              //删除所有x元素  {    while(a[i]==x) i++;       if(i<n) a[j++]=a[i++];  }  k=j;                    //新数组长度  //while(j<n) a[j++]=-1;   //多余位置统一赋0  return k;}

下面是测试用例:

int main(){   int j = 0, n , x;  cout<<"Input the length of your arrary: ";  cin>>n;  int *a=new int[n];  cout<<"And elements: "<<endl;  while(j<n)     cin>>a[j++];  cout<<"Cancel number: ";  cin>>x;  int rlength=csa(a,n,x);  cout<<"After canceling: "<<endl;  int i=0;  while(a[i]!=-1&&i<n)  { cout<<a[i++]<<" ";  }  cout<<endl<<"Real length of the array is "<<rlength<<endl;  return 0;}

测是结果举例:


Input the length of your arrary: 10
And elements:
2 2 1 3 4 2 5 6 2 2
Cancel number: 2
After canceling:
1 3 4 5 6
New length of the array is 5

以上算法可能不够简洁,希望有想法的朋友多多分享更简洁的做法。

0 0