华为的面试题 要求8分钟写出代码
我们整个宿舍 用了4天 都没有个思路
在网上参考了puresk的算法思想 才写出来这100多行代码
对puresky表示衷心的感谢
原文地址
源代码如下 可直接复制到vc6.0 编译
//
// Purpose: 给定两个的数组,任意交换两个数组中的元素,
// 使得两个数组中元素和差值最小,要求输出最小的差值!
// Algorithm: 每次从两个数组中分别选择一个数交换,使两个数组和的差值
// 减少的最多,迭代直到找不到这样可交换的数字对!
// Author: 董磊峰 算法参考puresky
// Date: 2012/06/10
//
#include<stdio.h>
#define N 20
int a[30],b[30];
void creat(int n); //向a b数组中输入数字
int solve();
int sum(int a[],int n); //求数字元素的和
void print(int a[],int n); //输出数组
void jiao(int x,int y,int *max,int *min); //交换元素
void main()
{
solve();
}
void creat(int a[],int n) //向a b数组中输入数字
{
int i;
printf("输入数组\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
/*
65 32 83 348 73 78 70 35 68 72 82 15 16 63 21 81 19 12 47 47
4 19 78 17 62 20 79 23 44 10 60 8 24 80 22 87 99 84 86 88
*/
}
int sum(int a[],int n) //求数组元素的和
{
int i,s=0;
for(i=0;i<n;i++)
s+=a[i];
return s;
}
void print(int a[],int n) //输出数组
{
int i;
for(i=0;i<N;i++)
printf("%3d",a[i]);
printf("总和是%d\n",sum(a,N));
}
int solve()
{
int sum1,sum2,s;
int *max,*min,dif;
int i,j,x,y; //临时交换变量
int flag=0; //代表是否有可以交换的元素 初值为0 默认为没有交换的元素
creat(a,N);
creat(b,N); //向a b数组中输入数字
printf("\n");
for(i=0;i<N;i++)
printf("%3d",i);
printf("\n");
print(a,N);
print(b,N);
sum1=sum(a,N);
sum2=sum(b,N);
if(sum1>sum2) //让max指针指向a b中较大的数组
{
max=a;
min=b;
dif=sum1-sum2; //dif为两数组和的差值 (保证dif为正数)
}
else
{
max=b;
min=a;
dif=sum2-sum1; //dif为两数组和的差值 (保证dif为正数)
}
printf("两数组的差为%d \n\n",dif);
int yuan=0; //应用于while函数 初值为0 代表差值减小的量
while(1) //while函数运行几次 就代表执行交换几次
{
flag=0; //每交换一次后yuan归零
x=0;y=0; //记录交换的位置
yuan=0; //每交换一次后yuan归零
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
s=max[i]-min[j]; //s为两数组中元素的差值(为大数组减去小数组)
if( s>0 && 2*s<=dif )
if(2*s>yuan)
{
yuan=2*s;
x=i;y=j; //记录交换的位置
flag=1;
}
}
if(flag)
{
printf("交换max[%d]的%d min[%d]的%d \n",x,max[x],y,min[y]);
jiao(x,y,max,min);
for(i=0;i<N;i++)
printf("%3d",i);
printf("\n");
print(a,N); //打印出两个数组及差值
print(b,N);
dif=dif-2*(min[y]-max[x]);
printf("两数组的差为%d \n\n",dif);
}
else
break;
}
return 0;
}
void jiao(int x,int y,int *max,int *min)
{
int temp;
temp=max[x]; //一下三行为元素交换
max[x]=min[y];
min[y]=temp;
}