最近想起了一个题:删除一个给定数组中的指定元素,要删除后还是一个连续分布的数组,也就是删除过程中要做相邻移位。
曾经见到一个非常简洁的做法,不过怎么都想不起来了。自己做了一个,希望有兴趣的朋友能给出更好的做法。
以下是我自己的实现函数,对给定数组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