一、问题描述
给定两个数组表示整数,比如Array1 = {2,4,1,0},Array2 = { 1,2,3,4},求第二个数组重组后的值,此值最接近第一个数组表示的整数,并且大于第一个数组中表示的整数。假设两个整数数组大小相同,并且肯定能找出符合条件的数。
举例:
输入:{2,4,1,0}和{1,2,3,4}
输出:{2,4,1,3}
二、分析与解答
将数组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