免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 天魔封神霸
打印 上一主题 下一主题

【华为公司Python面试题】,要求10分钟写出代码。。。 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2015-02-05 09:52 |显示全部楼层
思路:
合并两个列表,排序,然后按顺序从后往前每次取两个元素a, b,则a >= b
将取出来的数按a-b的值b进行分组
将分组按a-b的值排序然后合并,得到一个长为n的列表listab = [(a1,b1), (a2,b2), (a3,b3), ..., (an,bn)]
可证(listab[0] - listab[1]) >= (listab[i-1][0] - listab[i-1][1])  (0<= i < n)
定义两个空序列lista, listb
然后按从后往前的顺序取出listab的值并根据sum(lista)-sum(listb)的值,将ai,bi压入数组lista或listb
压入第一个时,abs(sum(lista) - sum(listb))最大,然后逐渐减小。
这个算法简单,实现也简单,思考5分钟,代码3-5分钟。
  1. def min_sub_of_sum(lista, listb):
  2.     listab = lista + listb
  3.     listab.sort()
  4.     tmp = {}
  5.     while listab:
  6.         a = listab.pop()
  7.         b = listab.pop()
  8.         tmp.setdefault(a-b, []).append((a, b))
  9.     subs = tmp.keys()
  10.     subs.sort()
  11.     for sub in subs:
  12.         listab.extend(tmp[sub])
  13.     lista, listb = [], []
  14.     # sub == sum(lista) - sum(listb)
  15.     sub = 0
  16.     while listab:
  17.         if sub < 0:
  18.             a, b = listab.pop()
  19.         else:
  20.             b, a = listab.pop()

  21.         lista.append(a)
  22.         listb.append(b)
  23.         sub += (a - b)
  24.     return lista, listb


  25. if __name__ == '__main__':
  26.     lista = range(100)
  27.     listb = [i^11 for i in lista]
  28.     a, b = min_sub_of_sum(lista, listb)
  29.     print a
  30.     print b
  31.     print sum(a) - sum(b)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP