华为训练题:整形数组合并

33 篇文章 0 订阅
3 篇文章 0 订阅
描述
 

题目标题:

将两个整型数组按照升序合并,并且过滤掉重复数组元素

详细描述:

接口说明

原型:

voidCombineBySort(int* pArray1,intiArray1Num,int* pArray2,intiArray2Num,int* pOutputArray,int* iOutputNum);

输入参数:

    int* pArray1 :整型数组1

     intiArray1Num:数组1元素个数

     int* pArray2 :整型数组2

     intiArray2Num:数组2元素个数

输出参数(指针指向的内存区域保证有效):

    int* pOutputArray:合并后的数组

     int* iOutputNum:合并后数组元素个数

返回值:

    void

 

 

知识点排序,数组
运行时间限制10M
内存限制128
输入

输入说明,按下列顺序输入:
1 输入第一个数组的个数
2 输入第一个数组的数值
3 输入第二个数组的个数
4 输入第二个数组的数值

输出

输出合并之后的数组

样例输入31 2 54-1 0 3 2
样例输出-101235
#include <iostream>
using namespace std;


void CombineBySort(int* pArray1, int iArray1Num, int* pArray2, int iArray2Num, int* pOutputArray, int* iOutputNum);

int main()
{
	int n, m;
	int i, j;

	//int a[100],b[100],c[200];
	//int *num;
	cin >> n;
	int *a = new int[n];
	for(i=0; i<n; i++)
	{
		cin >> a[i];
	}

	cin >> m;
	int *b = new int[m];
	for(j=0; j<m; j++)
	{
		cin >> b[j];
	}
	//for(i=0; i<m; i++)
	//	cout << b[i];

	int *c = new int[n+m];
	int *num = new int;

	CombineBySort(a, n, b, m, c, num);//调用函数
	
	for(i=0; i<*num; i++)
		cout << c[i];
	cout << '\n';

	return 0;
}

void CombineBySort(int* pArray1, int iArray1Num, int* pArray2, int iArray2Num, int* pOutputArray, int* iOutputNum)
{
	int i, j, k;
	int temp;
	int fOut;
	for(i=0; i<iArray1Num; i++)//对第一个数组排序
	{
		for(j=0; j< iArray1Num-1-i; j++)
		{
			if(pArray1[j] > pArray1[j+1])
			{
				temp = pArray1[j];
				pArray1[j] = pArray1[j+1];
				pArray1[j+1] = temp;
			}
		}
	}
	/*
	for(i=0; i< iArray1Num; i++)
	{
		cout << pArray1[i];
	}
	cout << endl;
	*/
	for(i=0; i<iArray2Num; i++)//对第二个数组排序
	{
		for(j=0; j< iArray2Num-1-i; j++)
		{
			if(pArray2[j] > pArray2[j+1])
			{
				temp = pArray2[j];
				pArray2[j] = pArray2[j+1];
				pArray2[j+1] = temp;
			}
		}
	}
	/*
	for(i=0; i< iArray2Num; i++)
	{
		cout << pArray2[i];
	}
	cout << endl;
	*/
	for(i=0,j=0,k=0; i+j < iArray1Num+iArray2Num-1; )//合并
	{
		if(pArray1[i] == fOut)//如果当前数值与前一个已确定输出值相同,则跳过
		{
			i++;
			//continue;
		}
		else if(pArray2[j] == fOut)//如果当前数值与前一个已确定输出值相同,则跳过
		{
			j++;
			//continue;
		}
		else//
		{
			if(pArray1[i] < pArray2[j])//如果第一个数组的值比第二个数组的值小
			{
				pOutputArray[k++] = pArray1[i];//则把第一个数组的值放入输出数组,并序号加一
				i++;
			}
			else if(pArray1[i] > pArray2[j] )
			{
				pOutputArray[k++] = pArray2[j];
				j++;
			}
			else if(pArray1[i] == pArray2[j])
			{
				pOutputArray[k++] = pArray2[j];
				i++;
				j++;
			}

			fOut = pOutputArray[k-1];//更新 前一个输出值fOut 
		}

		if(i == iArray1Num)//如果第一个数组都已经遍历完毕
		{
			for(j; j< iArray2Num; j++)//则把第二个数组的剩余的数字放入输出输入
			{
				if(pArray2[j] == fOut)//判断是否有重值
				{
					j++;
					continue;
				}
				else
				{
					
					pOutputArray[k++] = pArray2[j];
					fOut = pOutputArray[k-1];
				}
			}
			break;
		}
		else if(j == iArray2Num)//同理,如果第二个数组都已经遍历完毕
		{
			for(i; i< iArray1Num; i++)
			{
				if(pArray1[i] == fOut)
				{
					i++;
					continue;
				}
				else
				{
					
					pOutputArray[k++] = pArray1[i];
					fOut = pOutputArray[k-1];
				}
			}
			break;
		}

	}
	*iOutputNum = k;//输出数组的大小

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值