题目
description:
已知 A,B 和 C 为三个非递减有序的线性表,现要求对 A 表作如下操作:删去那些既在 B 表中出现又在 C 表中出现的元素。试对顺序表编写实现上述操作的算法。
input:
第一行输入 3 个正整数 m,n,p(m,n,p<=100),用空格分开,分别表示三个线性表中的元素个数,其后 3 行依次输入 A,B,C 表中的元素。
output:
输出实现上述操作后的 A 表。
sample_input:
8 5 6
1 2 3 4 5 6 6 7
2 3 5 9 12
2 4 5 6 12 13
sample_output:
1 3 4 6 6 7
思路
核心代码分为两步
- 第一步:找
新建数组d,存储数组b、c中的相同元素,数组d的长度取数组b、c中长度较小的那个;
接下来同时遍历数组b、c,将相同元素存入数组d中 - 第二步:删
同时遍历数组a、d,每找到一个相同元素,就在数组a中将该元素删除;
注意在数组a中删除元素,即依次将后面的元素往前移动一个位置
代码
#include <stdio.h>
#include <iostream>
using namespace std;
void deleteSame(int a[], int b[], int c[], int m, int n, int p);
int main() {
int m, n, p;
cin >> m >> n >> p;
int A[m], B[n], C[p];
int i;
for (i = 0; i < m; i++)
cin >> A[i];
for (i = 0; i < n; i++)
cin >> B[i];
for (i = 0; i < p; i++)
cin >> C[i];
deleteSame(A, B, C, m, n, p);
}
void deleteSame(int a[], int b[], int c[], int m, int n, int p) {
int r = n < p ? n : p;
int d[r]; //存储B、C中都存在的元素
int i, j, k, t, v;
i = j = k = t = v = 0;
while (i <= r && j <= r) {//i、j分别遍历数组B、C
if (b[i] == c[j]) {
d[k++] = b[i];//将数组B、C中相等的元素存入数组d
i++;
j++;
} else if (b[i] < c[j]) {
i++;
} else {
j++;
}
}
i = j = 0;
while (j <= k) {
if (a[i] == d[j]) {
v++; //统计A中含有的B、C重复元素个数
for (t = i; t < m; t++)
a[t] = a[t + 1]; //删除元素
i++;
} else if (a[i] < d[j]) {
i++;
} else
j++;
}
/*输出*/
for (i = 0; i < m - v; i++)
cout << a[i] << " ";
}
这篇博客介绍如何删除非递减有序顺序表中的重复元素,具体操作是删除同时存在于两个其他有序表中的元素。算法分为两步:首先找到两个表中相同的元素并存储在一个新数组中,然后遍历原表并移除与新数组中相同的元素。
4002

被折叠的 条评论
为什么被折叠?



