回 帖 发 新 帖 刷新版面

主题:“华为面试题!8分钟做出来”,我做的思路,大家帮看一下对不对,谢谢哈~!

原题:有两个数组a,b,大小都为n,数组元素的值任意,无序;
要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
原帖http://bbs.misuland.com/bbsstaticweb/bbs_bbsforumannounce1221209363477_2.html

我的答案:
我能想出来怎么做,不过我打字慢,8分钟打不出来!嘿嘿!

前边和大家想的都一样,也是计算出数组a和b的差值c,然后除以2再取整。
之后,再做一个循环过程:
    做一个由所有的a和b的元素差值生成的二维数组sub[i][j]。然后,遍历这个数组寻找和c差值最小的元素,交换数组a和b中的元素i和j。如果,sub[i][j]和c的差值小于或等于1,结束循环,否则,继续。

大家帮看看啊!谢谢了!有写代码快的,帮忙写出来验证一下,不胜感激啊 !

回复列表 (共24个回复)

21 楼

我想出了一个方法,不知道可以否,请大家指导一下。
第一步:
将两个数组合并成一个数组,算出所有元素之和的一半,即1/2(向上取整),假设该值为m;
第二步:
遍历整个新数组,取出n个值并相加得到和n,此时判断n和m是否相等,相等则退出,即可得到结果,否则重新遍历,判断是否与(m-1)相等,相等则退出,即可得到结果,依此类推

因为其中一个数组的总和越接近平均值m,则另一个也就最接近

22 楼

[quote]你们都没有读懂题,这是面试题,不是竞赛.

第一要求只是交换两个数组的值.
第二并没有要求出最优解.

此题只是考一下解决问题的能力和对数组程的能力.
而且考官基本没有时间读你的程序.

基本评分标准是循环次数,一次循环80分,两个循环60分.程序有错相应扣分.
能解释清楚算法和语句的目的相应加分.

一次循环算法是这样

sum_a = 0; sum_b = 0;

for_each i in 0, n
  if (sum_a > sum_b) swap(a[i], b[i]); 
  sum_a += a[i]; sum_b += b[i];
end for_each

要知道只有半小时的时间做题,还有很多客观题.

[/quote]
支持这种说法…………

23 楼

通过交换,a数组可以取到任何值的集合,那么其中一个排列必然是最忧的

24 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册