首页 > 试题广场 >

集合

[编程题]集合
  • 热度指数:30370 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给你两个集合,要求{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

python solution:

import sys

a=sys.stdin.readline().strip()
b=sys.stdin.readline().strip().split(" ")
c=sys.stdin.readline().strip().split(" ")

print(" ".join(sorted(set(b+c),key=int)))
发表于 2017-10-14 16:35:16 回复(9)
/*直接运用STL里的set来做,比较简单*/
#include<iostream>
#include<iterator>
#include<set>

using namespace std;
int main(void)
{
	int n, m;
	while (cin >> n, cin >> m)
	{
		set<int> st;
		int num;
		for (int i = 0; i < n + m; ++i)
		{
			cin >> num;
			st.insert(num);
		}
		int size = st.size();
		set<int>::iterator it = st.begin();
		for (int i = 0; i < size - 1; ++i)
		{
			cout << *it << " ";
			++it;
		}
		cout << *it << endl;
	}
	return 0;
}


发表于 2017-07-19 17:20:54 回复(18)
将输入的数据全部都保存到TreeSet中就可以了;TreeSet集合中的数据无重复,而且默认按照自然排序进行升序;不过TreeSet集合没有get方法,所以想要获取它的元素就需要使用迭代对象iterator:
import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;

public class StringUtil {

	//集合
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		TreeSet<Integer> set = new TreeSet<Integer>();
		while(in.hasNext()){
			int m = in.nextInt();
			int n = in.nextInt();
			for(int i=1; i<=m+n; i++){
				set.add(in.nextInt());
			}
			Iterator<Integer> it = set.iterator();
			while(it.hasNext()){
				System.out.print(it.next());
				if(it.hasNext())
					System.out.print(" ");
			}
		}
	}
}

编辑于 2017-09-07 18:51:01 回复(4)

直接set搞起来

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
set<int> s;
int main(){
    int n, m; scanf("%d%d", &n, &m);
    for(int i = 0; i < m + n; i++){
        int tmp; scanf("%d", &tmp);
        s.insert(tmp);
    }
    int first = 1;
    for(set<int>::const_iterator p = s.cbegin(); p != s.cend(); p++){
        if(first) {printf("%d", *p); first = 0;}
        else printf(" %d", *p);
    }    
    printf("\n");
}
发表于 2018-10-05 15:54:57 回复(0)
大家注意 他给的样例中存在本身相等的情况,做错的朋友要记得处理一下

发表于 2017-09-26 14:42:20 回复(3)
要按照并集来做,并不是集合相加,晕!
发表于 2017-07-10 19:37:01 回复(2)
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class Main {
     public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int alen = sc.nextInt();
        int blen = sc.nextInt();
        Set<Integer> set= new TreeSet<Integer>();
        for(int i=0;i<alen;i++){
            set.add(sc.nextInt());
        }
        for(int j=0;j<blen;j++){
            set.add(sc.nextInt());
        }
        Iterator<Integer> iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.print(iterator.next());
            if(iterator.hasNext()){
                System.out.print(" ");
            }
        }
    }
}

发表于 2017-08-18 18:37:30 回复(3)
正则表达式去重
var count = readline()
var mapOne = readline().split(' ')
var mapTwo = readline().split(' ')

var total = mapOne.concat(mapTwo)

var ans = total.sort(function (a, b) {
  return a - b
}).join(' ')
  .replace(/((\d+)(\s*))\1*\2*/g, '$2$3')
  .replace(/\s$/, '')

print(ans)

发表于 2017-07-27 01:09:05 回复(6)
#include <iostream>
#include <algorithm>
#define ARRSIZE 10000
using namespace std;

int main()
{
int n,m;
int arr[ARRSIZE*2];
cin >> n >> m;
int i = 0;
for (i = 0; i < n+m; i++) {
cin >> arr[i];
}
sort(arr,arr+n+m);
cout << arr[0];
for (i = 1; i < n+m; i++) {
if(arr[i] != arr[i-1])
cout<< " " << arr[i] ;
}
cout << endl;
return 0;
}

编辑于 2017-07-13 17:55:29 回复(0)
思路:关键就是用treeset这个数据结构,那么就可以去掉重复,也可以按数字顺序排列。。但是要用迭代器输出。

import java.util.*;
import java.io.*;

public class Main{
    public static void main(String[] args) throws Exception{
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        TreeSet<Integer> set = new TreeSet<>();
        for(int i = 1; i <= m+n;i++) {
            set.add(sc.nextInt());
        }
        
        Iterator<Integer> it = set.iterator();
        while(it.hasNext()) {
            System.out.print(it.next());
            if(it.hasNext()) {
                System.out.print(" ");
            }
        }
    }
}

发表于 2018-05-10 17:11:32 回复(4)
var arr = readline().split(' ');
var strA = readline();
var strB = readline();
var res = (strA + ' ' + strB).split(' ');
res.sort((a, b) => (a - b));
// 集合中无重复元素(去重)
var obj = {};
var r = [];
for(var i=0;i<res.length;i++) {
    if(!obj[res[i]]) {
        r.push(res[i]);
        obj[res[i]] = 1;
    }
}
print(r.join(' '));

发表于 2017-09-07 21:09:21 回复(0)
方法有好多,先说下面被注释的,笨方法,而且时间复杂度有点高,但是容易想,操作起来需要细心,
	创建一个新数组两个数组一个一个比大小进去,
感觉没有错,但是通过率有点尴尬,
之后就是这个通过的方法
					这个就是将他们push到vector容器中,排序+查重,
                    其实我是用习惯数组了,但是不得不说容器真的很方便,
#include<iostream>
#include<algorithm>
#include<vector>
#define N 20000
using namespace std;
int main()
{
	int m,n;
	while(cin>>m>>n)
	{
		vector<int> Number;int t;
		for(int i = 0;i<m+n;i++)
		{
			cin>>t;Number.push_back(t);
		}
		sort(Number.begin(),Number.end());
		for(int i = 0;i<m+n-1;i++)
		{
			if(Number[i]==Number[i+1])
            {Number.erase(Number.begin()+i);//为何不可以用 Number.erase(Number+i);
			--i;--n; }
		}
		for(int i = 0;i<m+n-1;i++)
		cout<<Number[i]<<" ";cout<<Number[m+n-1]<<endl;
	}
	return 0;
}
/*int main()
{
	int m,n;
	while(cin>>m>>n)
	{
		int a[m+1],b[n+1];
		for(int i = 0 ;i<m;i++)
		cin>>a[i];
		for(int i = 0;i<n;i++)
		cin>>b[i];
		int c[N];
		int k = 0;
		for(int i = 0,j = 0;i<m||j<n;)
		{
			if(i==m) c[k++] = b[j++];
			else if(j==n) c[k++] = a[i++];
			else if(a[i]==b[j]) {c[k++] = a[i++];j++;}
			else if(a[i]<b[j]) c[k++] = a[i++];
			else if(a[i]>b[j]) c[k++] = b[j++];
		}//cout<<k<<endl;
		for(int i = 0;i<k-1;i++)cout<<c[i]<<" ";cout<<c[k-1]<<endl;
	}
    return 0;
}*/

发表于 2017-08-22 10:44:58 回复(0)
int main()
{
    int n,m;
    cin>>n>>m;
    set<int> res;
    int x;
    for(int i=0;i<n+m;++i)
    {
        cin>>x;
        res.insert(x);
    }
    int c=0;
    for(auto i:res)
    {
        ++c;
        cout<<i;
        if(c!=res.size())
        {
            cout<<' ';
        }
    }
    return 0;
}

Set Set Set~
发表于 2020-08-11 16:33:59 回复(0)

一个list实现去重和排序!简单易懂

 /**
     * 思路:
     * 1.暴力
     * 2.使用list去重并排序
     * 3.时间复杂度:O(n)
     * 4.空间复杂度:O(n)
     * 5.这里吐槽下测试用例
     * 6.明明说好同一个集合中不会出现重复的元素,但是卡死在%10,看了题解才知道
     */
    public static void mergeSet(int len1, int[] set1, int len2, int[] set2) {
        //鲁棒
        if (len1 == 0 && len2 == 0) {
            System.out.println("");
        }
        List<Integer> list = new ArrayList<>();
        //1.set1全部进list
        for (int i = 0; i < len1; i++) {
            //去重
            if (!list.contains(set1[i])) {
                list.add(set1[i]);
            }
        }
        //2.set2也进list,但是利用contains方法去重
        for (int j = 0; j < len2; j++) {
            if (!list.contains(set2[j])) {
                list.add(set2[j]);
            }
        }
        //3.重写一个比较器,对list排序
        list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        //4.循环输出(注意最后一个空格应该去掉)
        for (int k = 0; k < list.size() - 1; k++) {
            System.out.print(list.get(k) + " ");
        }
        System.out.print(list.get(list.size() - 1));
    }


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[] set1 = new int[n];
        int[] set2 = new int[m];
        for (int i = 0; i < n; i++) {
            set1[i] = scanner.nextInt();
        }
        for (int j = 0; j < m; j++) {
            set2[j] = scanner.nextInt();
        }
        mergeSet(n, set1, m, set2);
    }


编辑于 2020-04-17 12:47:22 回复(0)
#include <iostream>
#include <vector>
#include <set>
using namespace std;

void solve(std::vector<int> &v1, std::vector<int> &v2) {
    std::set<int> s(v1.begin(), v1.end());
    s.insert(v2.begin(), v2.end());
    auto end = --s.end();
    for (auto it = s.begin(); it != end; ++it) {
        cout << *it << " ";
    }
    cout << *end;
}

int main() {
    int n1, n2;
    cin >> n1 >> n2;
    std::vector<int> v1(n1), v2(n2);
    for (int i = 0; i < n1; ++i)
        cin >> v1[i];
    for (int i = 0; i < n2; ++i)
        cin >> v2[i];

    solve(v1, v2);
    return 0;
}
发表于 2018-08-17 10:46:28 回复(0)
#include <iostream>
#include <set>
#include <vector>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    set<int> aset;
    for(int i = 0;i < n;i++) {
        int num;
        cin >> num;
        aset.insert(num);
    }
    for(int i = 0;i < m;i++) {
        int num;
        cin >> num;
        aset.insert(num);
    }

    vector<int> resvec(aset.begin(), aset.end());
    for(int i = 0;i < resvec.size();i++) {
        cout << resvec[i];
        i == resvec.size()-1 ? cout << endl : cout << ' ';
    }

    return 0;

}
发表于 2018-08-14 14:28:23 回复(0)
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n,m;
    cin >> n >> m;
    vector<int> data;
    for(int i = 0; i < n+m; i++)
    {
        int num;
        cin >> num;
        data.push_back(num);
    }
    
    sort(data.begin(), data.end());
    data.erase(unique(data.begin(), data.end()), data.end());
    for(int i = 0; i < data.size(); i++)
        i == 0 ? cout << data[i] : cout << " " << data[i];
    
    return 0;
}

发表于 2018-07-28 17:21:41 回复(0)
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
#include<hash_map>
#include<string>
#include<vector>
using namespace std;
int compare(int a,int b)
{
    return a<b;
}
int main()
{
    int m,n,a[20000],b[20000],c[20000];
    cin>>m>>n;
    for(int i=0;i<m+n;i++)
    cin>>a[i];
    sort(a,a+m+n,compare);
    int k=1;
    b[0]=a[0];
    for(int i=0;i<m+n-1;i++)
    {
        if(a[i]!=a[i+1])
        b[k++]=a[i+1];
    }
    for(int i=0;i<k;i++)
    if(i<k-1)
    cout<<b[i]<<" ";
    else
    cout<<b[i]<<endl;
    return 0;
}
 
发表于 2018-04-27 19:00:48 回复(0)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n, m, i, num, flag = 0;
    cin >> n >> m;
    vector<int> v;

    for (i = 0; i < n + m; i++)
    {
        cin >> num;
        v.push_back(num);
    }
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    for (i = 0; i < v.size(); i++)
    {
        if (flag == 0)
        {
            cout << v[i];
            flag = 1;
        }
        else cout << " " << v[i];
    }
    cout << endl;
    return 0;
}
发表于 2018-04-17 19:11:37 回复(0)
import os
import sys
import time

def main(argv):
    num = input()
    set_a = set(input().split(" "))
    set_b = set(input().split(" "))
    temp=set_a.union(set_b)
    result=list(temp)
    for x in range(0,len(result)):
        result[x]=int(result[x])
    result=sorted(result)
    for x in range(0,len(result)):
        if x==0:
            strg=str(result[0])
        else:
            strg=strg+" "+str(result[x])
    print(strg)
    return 0
    

if __name__=='__main__':
     main(sys.argv)
发表于 2018-04-17 15:23:45 回复(0)