华为公司Python面试题

Posted on 2011-07-22 15:24  仆本浪人  阅读(929)  评论(0编辑  收藏  举报
1.
有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
参考答案:
 1 # -*- coding: utf-8 -*-
2 #定义2个无序的整数列
3 a = [1,34,5,3,66,866,98,76]
4 b = [3,43,565,232,545,2,4,3]
5 #a b 的大小都是n
6 n = len(a)
7 #连接2个序列
8 c = a+b
9 #对新序列进行从小到大的排列
10 c.sort()
11 #从新取前面n个大小给a
12 a = c[:n]
13 #从新取后面n个大小给b
14 b = c[n:]
15 #打印a序列和减去b学历和
16 print sum(a) - sum(b)

  

#原理   很简单 因为a序列的和 是排序后最小的 减去 排序后最大的 所以 都是负数 呵呵 个人认为 负数越大 就是越小了
解析:[1,2,3][4,5,7]这是题设的两个序列 第一步:计算这两个序列各自的总量。在这个例子中,第一个为6,第二个为16。 之后,若序列原本为乱序则排序,这里的序列已经算是排序过了。 第二步:设总量较小的序列为Small,总量较大的序列为Big。这个例子中第二个序列总量较大。用Big中最大的数减去Small中最小的数,可以得到一个数值。如果这个数值的两倍小于Big的总量与Small的总量之差,则交换这两个数值后重新排序两个序列(其实只需将交换后的两个数插到序列对应的位置即可),之后重新开始第二步。 若这个数值的两倍大于Big与Small的总量之差,则分两路走,一路将Small的指针由第一位向后移而Big的指针不变;另外一路反过来移动Big的指针。两个指针均移动到两数之差大于Big、Small之差的前一个位置。之后比较两路交换后各自Big、Small总量之差,最终决定其中一路。 此操作完成后,最终的结果也就出来了。