【数据结构】NOJ003 顺序表的删除

题目:在数组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;
}

猜你喜欢

转载自blog.csdn.net/qq_41727666/article/details/88981559