你可以直接用C語言去模擬一個集合,然后每讀入一個數(shù)字,做一次遍歷,如果找到就刪除。最后才排一次序輸出。
雖然效率很低,時間復雜度有O(m*n),但對付這一題已經(jīng)綽綽有余了。也可以0MS 0K AC掉。
Code:
#include#includeint?cmp(const?int?*a,?const?int?*b)
{
????return?*a?-?*b;
}
int?main(void)
{
????int?n,?m,?i,?j;
????int?s[101];
????
????while?(scanf("%d%d",?&n,?&m),?m+n)
????{
????????for?(i?=?0;?i?<?n;?i++)
????????????scanf("%d",?s?+?i);
????????for?(i?=?0;?i?<?m;?i++)
????????{
????????????scanf("%d",?s?+?n);
????????????for?(j?=?0;?s[j]?!=?s[n];?j++);
????????????if?(j?!=?n)?s[j]?=?s[--n];
????????}
????????qsort(s,?n,?sizeof(int),?cmp);
????????for?(i?=?0;?i?<?n;?i++)
????????????printf("%d?",?s[i]);
????????printf(n???"n"?:?"NULLn");
????}
????
????return?0;
}如果你討厭用線性的查找方式,也可以修改一下。配合使用庫函數(shù)的二分找和快速排序,來實現(xiàn)。
但對付這題來說,有點殺雞用牛刀的感覺,呵呵。
Code:
#include#includeint?cmp(const?int?*a,?const?int?*b)
{
????return?*a?-?*b;
}
int?main(void)
{
????int?a;
????int?b;
????int?i;
????int?n;
????int?*p;
????int?s[128];
????
????while?(scanf("%d%d",?&a,?&b),?a?||?b)
????{
????????for?(i?=?0?;?i?<?a?;?i++)
????????????scanf("%d",?s?+?i);
????????qsort(s,?a,?sizeof(int),?cmp);
????????for?(i?=?0?;?i?<?b?;?i++)
????????{
????????????scanf("%d",?&n);
????????????p?=?bsearch(&n,?s,?a,?sizeof(int),?cmp);
????????????if?(p)
????????????{
????????????????a--;
????????????????*p?=?s[a];
????????????????qsort(s,?a,?sizeof(int),?cmp);
????????????}
????????}
????????if?(a)
????????{
????????????for?(i?=?0?;?i?<?a?;?i++)
????????????????printf("%d?",?s[i]);
????????????putchar('n');
????????}
????????else
????????????puts("NULL");
????}
????return?0;
}
其實我們可以用歸并排序的思想來做。效率從O(m*n) -> O((m+n)log2(m+n))
#include#includeint?cmp(const?int?*a,?const?int?*b)
{
return?*a?-?*b;
}
int?main(void)
{
int?n,?m,?i,?j,?c;
int?s[128];
int?t[128];
while?(scanf("%d%d",?&n,?&m),?m+n)
{
for?(i?=?0;?i?<?n;?i++)
scanf("%d",?s?+?i);
for?(i?=?0;?i?<?m;?i++)
scanf("%d",?t?+?i);
qsort(s,?n,?sizeof(int),?cmp);
qsort(t,?m,?sizeof(int),?cmp);
for?(c?=?i?=?j?=?0;?i?<?n?&&?j?<?m;)
{
if?(s[i]?<?t[j])
printf("%d?",?s[i++],?c++);
else?if?(s[i]?>?t[j])
j++;
else
{
i++;
j++;
}
}
for?(;?i?<?n;)?printf("%d?",?s[i++],?c++);
printf(c???"n"?:?"NULLn");
}
return?0;
}
其實這些集合的操作都包含在C++的set類庫里了。
這時候用C++編碼真是提速不少。詳請參見參考代碼。





