读书人

分享一路华为面试题

发布时间: 2012-07-03 13:37:43 作者: rapoo

分享一道华为面试题
有两个序列a,b,大小都有n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b无素的和]之间的差最小。
例如:
var a = [100, 99, 98, 1, 2, 3];
var b = [1, 2, 3, 4, 5, 40];

[解决办法]
第一步排序
然后求出中间值
然后从1到n/2个数中遍历,替换对应的数据使结果接近中间值,一旦有替换重新遍历

[100, 99, 98, 1, 2, 3];
[1, 2, 3, 4, 5, 40];
第一步40换100(实际上这题本身从小换更简单,不过为求一般从大换起),重新遍历,5换40,重新遍历 然后4换5,3换4,2换3,1换3,由于例子比较简单,以后2个和3个的遍历均无法接近,因此结束
[解决办法]

探讨
没有做代码实现,写下思路,大家看看对不对,个人感觉想得不是太清楚,如何证明正确或如何证明错误没理清

1、两数组A和B归并为一个排好序的数组C
2、清空A和B
3、从C中每次取两个元素分别放入A和B

取数原则:
1、取第一个和最后一个放入A
2、取第二个和倒数第二个放入B
3、依此类推
4、若取到最后只剩两个数了,计算A的和与B的和,将大的放入‘和’较小的数组,小的放入‘和’……

[解决办法]
1、将2n个数累计求和,得到totel_2n

2、排列组合将其中n个数取出,求累计totel_n,找到最接近totel_2n/2的组合,小于等于1就是答案,可返回。如果不是,则记录下最小的差异,继续遍历。

3、取数过程中,如果累计和已经大于totel_2n/2,换数进行下一轮组合,继续遍历。

4、遍历完后,结果要么是最小的差异,要么是0或者1的差异。
[解决办法]
探讨

引用:
怎么都不仔细想的,谁说最大和次大一定是要分开的?
0, 66,67,68,100,101
我在14楼的思路是必然可以得到结果,当然算法可能未必好,但是对于某些数据,必然要有2个数字甚至3个数字交换

假如存在一个最大和次大在一起的,可使|sum(a)-sum(b)|最小,不妨设sum(a)>sum(b)
a:max1,max2,。。。。。
b:var1,……

读书人网 >C++

热点推荐