题目:在数组a中,删去那些b和c的共同元素
方法:
设数组a、b、c的下标分别为i、j、k
从数组b和c的后面往前找,如果找到相同元素x
就从数组a的后面往前找这个元素x
如果找到了,删除x
如果没找到,就继续遍历数组b和c
直到i、j、k有一个为负为止
从后往前找的原因是,感觉这样移动的元素会少一点
在算法中,时刻要防止a[-1]这种情况的出现,也就是始终要检查下标是否越界(虽然测例里貌似没有这种情况,我忘了检查也AC了)
#include <iostream>
using namespace std;
int a[101];
int b[101];
int c[101];
int main()
{
//输入
int m,n,p;
cin>>m>>n>>p;
for(int i=0; i<m; i++)
cin>>a[i];
for(int i=0; i<n; i++)
cin>>b[i];
for(int i=0; i<p; i++)
cin>>c[i];
//删除,ijk分别为数组abc的下标,从后往前遍历
for(int i=m-1,j=n-1,k=p-1; !(i<0 || j<0 || k<0); ) {
if(b[j]>c[k]) j--; //如果b的元素较大,b的下标减一
else if(b[j]<c[k]) k--;
//此时b[j]==c[k],即找到了相同元素
else {
//在a中找这个元素
while(i>=0 && a[i]>b[j]) i--;
//如果找到了
if(i>=0 && a[i]==b[j]) {
//用覆盖的方式删除
for(int l=i; l<m-1; l++)
a[l]=a[l+1];
m=m-1; //a中元素个数减一
i=i-1; //a的下标减一
}
//如果没找到,b和c的下标需要减一
if(i>=0 && a[i]!=b[j]) {
j--;
k--;
}
}
}
//输出
for(int i=0; i<m-1; i++)
cout<<a[i]<<' ';
cout<<a[m]<<endl;
return 0;
}