本关任务:给定两个无序数组arr1和arr2,编写一个程序实现这两个数组的升序合并。
为了完成本关任务,你需要掌握:1.升序合并思路,2.Algorithm中的合并函数merge。
要求解两个无序数组的升序合并,自然的,按照升序与合并位置关系,可分为先升序后合并和先合并后升序两种方式,假设数组一的个数为N,数组二的个数为M:
合并数组是一个很常见的操作,例如在归并排序和快速排序的递归求解过程中,就需要将两个有序数组合并成一个。因此通过调用C++Algorithm中模板函数merge,来快速实现这一操作是非常方便有效的。
合并函数的核心思想是设置两个头指针,分别指向两个升序数组首地址,通过比较两个头指针的大小,每次都将小的数值放入新的数组,然后小数值指针后移,最后新的数组也是有序的,从而完成合并过程,复杂度为O(N+M)。其函数原型和应用实例如下:
1\\函数原型2template3OutputIteratormerge(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2,OutputIteratorresult)4{5while(true){6if(first1==last1)returnstd::copy(first2,last2,result);7if(first2==last2)returnstd::copy(first1,last1,result);8*result++=(*first2<*first1)*first2++:*first1++;9}10}11\\应用实例12intarr1[3]={1,2,3};13intarr2[4]={2,3,4,5};14intarr3[7];15merge(arr1,arr1+n1,arr2,arr2+n2,arr3);16\\arr3结果为{1,2,2,3,3,4,5}编程要求本关的编程任务是补全右侧代码片段Merge_Array中Begin至End中间的代码,具体要求如下:
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
16
146575330753236734176409463729
13
18521712909561781927688996
66121417181927293032363740415253576168737576788990949596
第一行整数N第二行N个整数(无序)第三行整数M第四行M个整数(无序)
输出一行,包含N+M个升序整数,末尾换行!!!
开始你的任务吧,祝你成功!
本关任务:给定两个升序数组arr1和arr2,编写一个程序判定数组arr1是否包含数组arr2,例如arr1=[1,2,3,4],arr2=[2,3],则数组arr1包含数组arr2,若arr2=[2,5],则数组arr1不包含数组arr2。
为了完成本关任务,你需要掌握:1.有序数组包含,2.Algorithm中的包含函数includes。
无序数组的包含问题就像是字符串应用中的最长公共子序列,解法是动态规划,而有序数组的包含则是简单的判断问题,解法类似有序数组的合并。
同样的,其核心思想也是设置两个头指针分别指向两个升序数组,若指针指向的元素相等,则两个指针都往后移动,否则指向数组arr1的指针往后移动,直到指针移向数组尾地址。
Algorithm中的包含函数includes是不常用但却又比较实用的函数,它避免了我们编写复杂的代码,同时,模板函数的优势可以让我们自定义数据类型,在数据库等查询任务中是非常方便有效的,其函数原型及应用实例如下:
1\\函数原型2template3boolincludes(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2)4{5while(first2!=last2){6if((first1==last1)||(*first2<*first1))returnfalse;7if(!(*first1<*first2))++first2;8++first1;9}10returntrue;11}12\\应用实例13intarr1[4]={1,2,3,4};14intarr2[2]={2,3};15booljudge(arr1,arr1+4,arr2,arr2+2);16//judge结果为true编程要求本关的编程任务是补全右侧代码片段Include_Array中Begin至End中间的代码,具体要求如下:
11
615252640435462707881
6
62540547081
array1includesarray2
第一行整数N第二行N个整数(升序)第三行整数M第四行M个整数(升序)
若数组arr1包含数组arr2,则输出array1includesarray2,否则输出array1notincludesarray2
本关任务:给定两个集合A和B,编写一个程序实现这两个集合的并集与交集。
为了完成本关任务,你需要掌握:1.集合,2.集合的并,3.集合的交。
集合是由一个或多个确定的元素所构成的整体。集合中的元素有三个特征:
但是本关卡为了在最后方便测试输出集合是否正确,对输出集合做了升序的要求。
集合A和集合B的并是由所有属于集合A或属于集合B的元素所组成的集合,记作AB或者BA,并集的一个重要属性就是越并越多。假定集合A=(1,2,3,4,5,6,7),集合B=(6,7,8,9),那么集合A和集合B的并集为AB=(1,2,3,4,5,6,7,8,9)。
Algorithm算法模板中集成了集合的并操作,函数名称为set_union,其作用是将两个集合合并成一个集合,但是要求输入的两个集合必须是有序的,这看似违背了集合的定义,但是有序的目的是为了让求并的过程实现起来变得简单。因此,在本关卡中,首先需要将两个集合排序,然后才调用set_union函数计算出并集。其函数原型及应用实例如下:输入参数是两个集合的首尾地址以及一个保存并集结果的数组的首地址,最后返回数组尾地址:
1\\函数原型2template3OutputIteratorset_union(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2,OutputIteratorresult)4{5while(true)6{7if(first1==last1)returnstd::copy(first2,last2,result);8if(first2==last2)returnstd::copy(first1,last1,result);9if(*first1<*first2){*result=*first1;++first1;}10elseif(*first2<*first1){*result=*first2;++first2;}11else{*result=*first1;++first1;++first2;}12++result;13}14}15\\应用实例16intarr1[3]={1,2,3};17intarr2[3]={2,3,4};18intarr3[4];19intn=set_union(arr1,arr1+n1,arr2,arr2+n2,arr3)-arr3;20\\arr3结果为{1,2,3,4}21\\n结果为4集合的交集合A和B的交是由所有属于集合A以及属于集合B的元素所组成的集合,记作A∩B或者B∩A,交集的一个重要属性就是越交越少。假定集合A=(1,2,3,4,5,6,7),集合B=(6,7,8,9),那么集合A和集合B的交集为A∩B=(6,7)。
Algorithm算法模板中集成了集合的交操作,函数名称为set_intersection,其作用是将两个集合交成一个集合,同样的要求输入的两个集合必须是有序的。因此,首先需要将两个集合排序,然后才调用set_intersection函数计算出交集。其函数原型及应用实例如下,输入参数是两个集合的首尾地址以及一个保存交集结果的数组的首地址,最后返回数组尾地址:
1\\函数原型2template3OutputIteratorset_intersection(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2,OutputIteratorresult)4{5while(true)6{7if(first1==last1)returnstd::copy(first2,last2,result);8if(first2==last2)returnstd::copy(first1,last1,result);9if(*first1<*first2){*result=*first1;++first1;}10elseif(*first2<*first1){*result=*first2;++first2;}11else{*result=*first1;++first1;++first2;}12++result;13}14}15\\应用实例16intarr1[3]={1,2,3};17intarr2[3]={2,3,4};18intarr3[2];19intn=set_intersection(arr1,arr1+n1,arr2,arr2+n2,arr3)-arr3;20\\arr3结果为{2,3}21\\n结果为2编程要求本关的编程任务是补全右侧代码片段Set_Union和Set_Intersection中Begin至End中间的代码,具体要求如下:
测试输入:
7
1234567
4
6789
预期输出:
Union:9
{1,2,3,4,5,6,7,8,9}
Intersection:2
{6,7}
本关任务:给定两个集合A和B,编写一个程序实现集合B关于集合A的相对差集AB,集合A相对集合B的相对差集BA,以及集合A与集合B的对称差集。
为了完成本关任务,你需要掌握:1.集合相对差集,2.集合对称差集。
集合差集也叫集合补集,是一个相对的定义:由属于A而不属于B的元素组成的集合,称为B关于A的相对补集,记作AB。例如集合A=(1,2,3,4),集合B=(3,4,5,6),那么集合AB=(1,2)。
1\\函数原型2template3OutputIteratorset_difference(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2,OutputIteratorresult)4{5while(first1!=last1&&first2!=last2)6{7if(*first1<*first2){*result=*first1;++result;++first1;}8elseif(*first2<*first1)++first2;9else{++first1;++first2;}10}11returnstd::copy(first1,last1,result);12}13\\应用实例14intarr1[4]={1,2,3,4};15intarr2[4]={3,4,5,6};16intarr3[4];17intn=set_difference(arr1,arr1+n1,arr2,arr2+n2,arr3)-arr3;18\\arr3结果为{1,2}19\\n结果为2集合对称差集集合A与集合B的对称差集定义为属于集合A与集合B,但不属于它们交集A∩B的元素集合,记为A△B。也就是说A△B=x∣x∈A∪B且x∈/A∩B,即A△B=(A∪B)—(A∩B)。同样也可以用相对差集的并来表示A△B=(A—B)∪(B—A)。例如上述的两个集合,他们的对称差集为A△B=(1,2,5,6)。
Algorithm算法模板中集成了集合对称差集的操作,函数名称为set_symmetric_difference,其作用是计算出两个集合的对称差集,同样的,要求输入的两个集合必须是有序的。其函数原型及应用实例如下:
1\\函数原型2template3OutputIteratorset_symmetric_difference(InputIterator1first1,InputIterator1last1,InputIterator2first2,InputIterator2last2,OutputIteratorresult)4{5while(true)6{7if(first1==last1)returnstd::copy(first2,last2,result);8if(first2==last2)returnstd::copy(first1,last1,result);9if(*first1<*first2){*result=*first1;++result;++first1;}10elseif(*first2<*first1){*result=*first2;++result;++first2;}11else{++first1;++first2;}12}13}14\\应用实例15intarr1[4]={1,2,3,4};16intarr2[4]={3,4,5,6};17intarr3[8];18intn=set_symmetric_difference(arr1,arr1+n1,arr2,arr2+n2,arr3)-arr3;19\\arr3结果为{1,2,5,6}20\\n结果为4编程要求本关的编程任务是补全右侧代码片段Set_Difference和Set_Symmetric_Difference中Begin至End中间的代码,具体要求如下:
A-B:5
{1,2,3,4,5}
B-A:2
{8,9}
(A-B)U(B-A):7
{1,2,3,4,5,8,9}
本关任务:给定排列的大小n,计算出从1,2,3,..,n开始的下m个排列,以及从n,..,3,2,1开始的上m个排列,并输出结果。
例如n=3,m=4,那么从1,2,3开始的下4个排列为:1,2,3;1,3,2;2,1,3;2,3,1,从3,2,1开始的上4个排列为:3,2,1;3,1,2;2,3,1;2,1,3。
为了完成本关任务,你需要掌握:1.序列排列,2.Algorithm中下一个排列模板函数,3.Algorithm中上一个排列模板函数。
一般地,从n个不同元素中取出m个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列permutation。特别地,当m=n时,这个排列被称作全排列allpermutation,本关卡就是关于n的全排列问题。
给定一个排列序列,Algorithm中的模板函数next_permutation可以产生该排列的下一个序列,输入参数为序列的首地址和尾地址,其函数模板及应用实例如下:
1\\函数模板2template3boolnext_permutation(BidirectionalIteratorfirst,BidirectionalIteratorlast);4\\应用实例5intmyints[]={1,2,3};6do{7std::cout<1\\函数模板2template3boolprev_permutation(BidirectionalIteratorfirst,BidirectionalIteratorlast);4\\应用实例5intmyints[]={3,2,1};6do{7std::cout<