算法练习:数位重组

一、问题描述

给定两个数组表示整数,比如Array1 = {2410}Array2 = { 1234},求第二个数组重组后的值,此值最接近第一个数组表示的整数,并且大于第一个数组中表示的整数。假设两个整数数组大小相同,并且肯定能找出符合条件的数。

举例:

输入:{2410}{1234}

输出:{2413}

 

二、分析与解答

将数组2中的数按从小到大的顺序排序,然后从数组1中的0号单元开始依次扫描,在每一趟扫描的过程中,从数组2的递增序列中挑选一个大于或等于当前扫描位的值,并标记已使用,如果在扫描的过程中,挑选了一个大于当前扫描位的值时,直接将递增序列中剩余的数字依次复制到结果集中即可。

 

三、代码实现

//数位重组
#include <iostream>
#include <algorithm>

using namespace std;

bool GetClosestBigger( const int nArray1[], int nCount1, int nArray2[], int nCount2 )
{
	if ( nArray1 == NULL || nArray2 == NULL || nCount1 != nCount2 )
	{
		return false;
	}

	//对nArray2按从小到大排序
	sort( nArray2, nArray2+nCount2 );

	bool* bUses = new bool[nCount2];
	memset( bUses, 0, sizeof(bool)*nCount2 );
	int* pResultArray = new int[nCount2];
	memset( pResultArray, 0, sizeof(int)*nCount2 );

	for( int i = 0; i < nCount1; ++i )
	{
		int j = 0;

		//挑选一个大于或等于的数字
		while( j < nCount2 && ( bUses[j] || nArray2[j] < nArray1[i]) )
			++j;
		if ( j == nCount2 )
			break;


		bUses[j] = true;
		pResultArray[i] = nArray2[j];

		//大于时,直接复制剩下的递增序列即可
		if ( nArray2[j] > nArray1[i] )
		{
			for ( j = 0; j < nCount2; ++j )
			{
				if ( !bUses[j]) pResultArray[++i] = nArray2[j];
			}
			break;
		}	
	}

	//复制结果
	for( int i = 0; i < nCount2; ++i )
	{
		nArray2[i] = pResultArray[i];
	}



	//内存释放
	if ( bUses )
	{
		delete[] bUses;
		bUses = NULL;
	}

	if ( pResultArray )
	{
		delete[] pResultArray;
		pResultArray = NULL;
	}


	
	return true;
}



int main()
{
// 	int nArray1[] = { 2, 4, 1, 0 };
// 	int nArray2[] = { 1, 2, 3, 4 };

// 	int nArray1[] = { 8, 6, 5, 4, 3 };
// 	int nArray2[] = { 5, 4, 8, 6, 7 };

	int nArray1[] = { 8, 6, 5, 4, 3 };
	int nArray2[] = { 5, 2, 8, 1, 7 };

	GetClosestBigger( nArray1, _countof(nArray1), nArray2, _countof(nArray2) );

	for( int i = 0; i < _countof(nArray2); ++i )
	{
		cout << nArray2[i] << " ";
	}
	cout << endl;


	return 0;
}


系列文章说明:
1.本系列文章[算法练习],仅仅是本人学习过程的一个记录以及自我激励,没有什么说教的意思。如果能给读者带来些许知识及感悟,那是我的荣幸。
2.本系列文章是本人学习陈东锋老师《进军硅谷,程序员面试揭秘》一书而写的一些心得体会,文章大多数观点均来自此书,特此说明!
3.文章之中,难免有诸多的错误与不足,欢迎读者批评指正,谢谢.


作者:山丘儿
转载请标明出处,谢谢。原文地址:http://blog.youkuaiyun.com/s634772208/article/details/46494143


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值