列表

详情


JD7. 集合

描述

给你两个集合,要求{A} + {B}。 注:同一个集合中不会有两个相同的元素。

输出时按数字升序输出。

数据范围: ,集合中的元素满足

输入描述

每组输入数据分为三行,第一行有两个数字n,m,分别表示集合A和集合B的元素个数。后两行分别表示集合A和集合B。每个元素为不超过int范围的整数,每个元素之间有个空格隔开。

输出描述

针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开,行末无空格。

示例1

输入:

3 3
1 3 5
2 4 6

输出:

1 2 3 4 5 6

示例2

输入:

2 2
1 2
1 2

输出:

1 2

原站题解

C++ 解法, 执行用时: 1ms, 内存消耗: 504KB, 提交时间: 2017-09-07

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#include <algorithm>
using namespace std;

int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    int *ss = (int *)malloc(n*sizeof(int));
    for(int i=0;i<n+m;i++)scanf("%d",ss+i);
    sort(ss,ss+n+m);
    
    int temp;
    if(n+m >= 1){
        printf("%d",ss[0]);
        temp = ss[0];
    }
    for(int i=1;i<n+m;i++){
        if(ss[i] == temp)continue;
        printf(" %d",ss[i]);
        temp = ss[i];
    }
    
    return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 628KB, 提交时间: 2017-08-17

#include<stdio.h>  
#include<algorithm>  
using namespace std;  
int s[20020];  
int main()  
{  
    int a,b,i;  
    while(~scanf("%d%d",&a,&b))  
    {  
        for(i=0;i<a+b;i++)  
        {  
            scanf("%d",&s[i]);  
        }  
        sort(s,s+a+b);  
        printf("%d",s[0]);  
        for(i=1;i<a+b;i++)  
        {  
            if(s[i-1]!=s[i])  
            printf(" %d",s[i]);  
        }     
        puts("");  
    }  
    return 0;  
}  

C++ 解法, 执行用时: 3ms, 内存消耗: 632KB, 提交时间: 2017-07-26

#include<cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    vector<int> v;
    int n,m,i;
    int temp;
    while(scanf("%d%d",&n,&m)!=EOF){
    	  v.clear();
         for(i=1;i<=m+n;i++){
         	scanf("%d",&temp);
         	 v.push_back(temp);
         }	
         sort(v.begin(),v.end());
         v.erase(unique(v.begin(), v.end()), v.end());
         for (i = 0; i < v.size()-1; i++)
        {
             printf("%d ",v[i]);
        }
        printf("%d\n",v[i]);
    }
    //unique()函数将重复的元素放到vector的尾部 然后返回指向第一个重复元素的迭代器 再用erase函数擦除从这个元素到最后元素的所有的元素
    return 0;
}

C 解法, 执行用时: 4ms, 内存消耗: 376KB, 提交时间: 2020-09-17

#include<stdio.h>
void fast(int* a,int f,int l){
    int i =f,j=l;
    int val = a[i];
    int temp;
    while(i<j){
        while(i<j && val<=a[j]){
            j--;
        }
        while(i<j && val>=a[i]){
            i++;
        }
        if(i<j){
            temp = a[j];
            a[j]=a[i];
            a[i]=temp;
        }
    }
    temp = a[j];
    a[j]=a[f];
    a[f]=temp;
    if(i-1>f)
        fast(a,f,i-1);
    if(l>i+1)
        fast(a,i+1,l);
}

int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    int * a=(int*)malloc(sizeof(int)*(n+m));
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=n;i<n+m;i++){
        scanf("%d",&a[i]);
    }
    fast(a,0,n+m-1);
    for(int i=0;i<n+m;i++){
        if(i==0)
            printf("%d",a[0]);
        if(i>0 && a[i]!=a[i-1]){
            printf(" %d",a[i]);
        }
    }
    return 0;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 480KB, 提交时间: 2018-09-12

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2e4+3;
int read(){
    int x=0;char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
    return x;
}
int A[N];
int main(){
    int x=read(),n=x+read();
    if(!n)return 0;
    for(int i=0;i<n;i++)A[i]=read();
    sort(A,A+n);
    printf("%d",A[0]);
    for(int i=1;i<n;i++)
        if(A[i]!=A[i-1])printf(" %d",A[i]);
    return 0;
}

上一题