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

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

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

以下是我自己的实现函数,对给定数组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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值