华为的面试题 要求8分钟写出代码

华为的面试题 要求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;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值