zoukankan      html  css  js  c++  java
  • C语言编程练习20:计算合并

    题目描述

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

    输入

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

    输出

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

    样例输入 Copy

    1 2
    1
    2 3
    1 2
    1
    1 2

    样例输出 Copy

    1 2 3
    1 2


    思路:其实就是一道数组合并去重并排序,先把A、B两个数组分别排序,然后开一个新的数组C用来存放合并后的数组。
    比较A、B两个数组每个元素的大小,小的放入新的数组C,若相等则选择A、B任意一个数组的元素放入新数组C。比较完后
    把A或者B剩余的元素依次放入C。
    #include <stdio.h>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
    	int n,m;
    	
    	while((scanf("%d %d",&n,&m))!= EOF)
    	{
    		int *a = (int *)malloc(sizeof(int)*n);
    		int *b = (int *)malloc(sizeof(int)*m);
    		int *c = (int *)malloc(sizeof(int)*(m+n));
    		for(int t = 0; t<n;t++)
    		{
    			scanf("%d",&a[t]);
    		}
    		sort(a,a+n);//排序
    		for(int t = 0; t<m;t++)
    		{
    			scanf("%d",&b[t]);
    		}
    		sort(b,b+m);//排序
    		int i=0,j=0,k=0,cnt=0;//cnt记录元素个数
    		while(i<n&&j<m)//把元素从小到大依次放入数组C
    		{
    			if(a[i]<b[j])
    			{
    				c[k++]=a[i];
    				i++;
    				cnt++;
    			}
    			if(b[j]<a[i])
    			{
    				c[k++] = b[j];
    				j++;
    				cnt++;
    			}
    			if(a[i]==b[j])
    			{
    				c[k++]=a[i];
    				i++;
    				j++;
    				cnt++;
    			}
    		}
    		if(i==n)//把B中的剩余元素放入C
    		{
    			for(int t=j;t<m;t++)
    			{
    				c[k++]=b[t];
    				cnt++;
    			}
    		}
    		if(j==m)//把A中的剩余元素放入C
    		{
    			for(int t=i;t<n;t++)
    			{
    				c[k++]=a[t];
    				cnt++;
    			}
    		}
    		for(int t = 0 ;t<cnt-1;t++)
    		{
    			printf("%d ",c[t]);
    		}
    		printf("%d
    ",c[cnt-1]);
    	}
        return 0;
    }
    

     可以把合并有序数组单独写作一个函数merge

    void Merge(int *a, int *b, int *c, int nA, int nB, int& nCout)
    {
        int i = 0 ;
        int j = 0 ;
        int k = 0 ;
         
        while (i < nA && j < nB)
        {
            if (a[i] < b[j])// 如果a的元素小,则插入a中元素到c
            {
                c[k++] = a[i] ;
                ++i ;
                nCout++;
            }
            else if (a[i] == b[j])// 如果a和b元素相等,则插入二者皆可,这里插入a
            {
                c[k++] = a[i] ;
                ++i ;
                ++j ;
                nCout++;
            }
            else // a[i] > b[j] // 如果b中元素小,则插入b中元素到c
            {
                c[k++] = b[j] ;
                ++j ;
                nCout++;
            }
        }
         
        if (i == nA) // 若a遍历完毕,处理b中剩下的元素
        {
            for (int m = j; m < nB; ++m)
            {
                c[k++] = b[m] ;
                nCout++;
            }
        }
        else//j == n, 若b遍历完毕,处理a中剩下的元素
        {
            for (int m = i; m < nA; ++m)
            {
                c[k++] = a[m] ;
                nCout++;
            }
        }
    }
    
     
  • 相关阅读:
    Bayesian CTR Prediction for Bing
    Gaussian and Truncated Gaussian
    An Introduction to Variational Methods (5.3)
    An Introduction to Variational Methods (5.2)
    An Introduction to Variational Methods (5.1)
    Variational Bayes
    微软的一篇ctr预估的论文:Web-Scale Bayesian Click-Through Rate Prediction for Sponsored Search Advertising in Microsoft’s Bing Search Engine。
    第五十二课、命令行参数的应用------------------狄泰软件学院
    第五十一课、程序中的配置文件------------------狄泰软件学院
    第五十课、关于对话框(About)------------------狄泰软件学院
  • 原文地址:https://www.cnblogs.com/FantasticDoubleFish/p/14317283.html
Copyright © 2011-2022 走看看