|
很久以前的华为招聘考试题(要求8分钟写出代码)
有两个数组a,b,大小都为n,数组元素的值任意,无序;
要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
我可没有这本事,花了个多小时才搞定,发出代码供大家交流- #include <iostream.h>
- #include <cstring>
- int a[]={4,99,0,888,0,122,1,999,1200,10};
- int b[]={0,2,19,3,420,66,0,80,546,123};
- // 排序算法,由大到小,p是数组的指针
- void sort(int *p,int len);
- // 求数组元素之和
- int sum(int *p,int len);
- int main()
- {
- // 取数组a的长度
- int len_a=sizeof(a)/sizeof(a[0]);
- int temp[(sizeof(a)/sizeof(a[0]))*2];
- // 合并数组
- for(int i=0;i<len_a;i++)
- {
- temp[i]=a[i];
- }
- for(i=0;i<len_a;i++)
- {
- temp[i+len_a]=b[i];
- }
- int len=sizeof(temp)/sizeof(temp[0]);
- //输出总和
- cout<<"总数="<<sum(temp,len)<<endl;
- sort(temp,len);
- cout<<"数组temp由大到小排序为:\n";
- for (i=0;i<len;i++)
- {
- cout<<temp[i]<<"\t";
- }
- // 将数组a清零
- int size=sizeof(a);
- memset(a,0,size);
- // 将数组b清零
- memset(b,0,size);
- // 重新排列的算法
- a[0]=temp[0];
- b[0]=temp[1];
- int n=1,m=1,j=len_a-1;
- for(i=2;i<len_a*2;i++)
- {
- if(sum(a,len_a)<sum(b,len_a))
- {
- if(n<len_a)
- a[n]=temp[i];
- else
- {
- {b[j]=temp[i];j--;}
- }
- n++;
- }
- else
- {
- if(m<len_a)
- b[m]=temp[i];
- else
- {
- {a[j]=temp[i];j--;}
- }
- m++;
- }
- }
- cout<<"重新排列后\n";
- for (i=0;i<len_a;i++)
- {
- cout<<a[i]<<"\t";
- }
- cout<<endl<<"数组之和 a="<<sum(a,len_a)<<endl;
- for (i=0;i<len_a;i++)
- {
- cout<<b[i]<<"\t";
- }
- cout<<endl<<"数组之和 b="<<sum(b,len_a)<<endl;
- return 1;
- }
- void sort(int *p,int len)
- {
- for (int i=0;i<len;i++)
- {
- for (int j=len-1;j>i;j--)
- {
- if(*(p+i)<*(p+j))
- {
- int a;
- a=*(p+i);
- *(p+i)=*(p+j);
- *(p+j)=a;
- }
- }
- }
- }
- int sum(int *p,int len)
- {
- int i, a=0;
- for(i=0;i<len;i++)
- {
- a+=*(p+i);
- }
- return a;
- }
复制代码 |
评分
-
查看全部评分
|