华为面试题,2个列表差额最小

##有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
##要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
##有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
##
##要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

#思路,集合到一个列表中,从大到小排序,从大的开始分,分为a,b2个列表。a放第一个,b放第二个,第三个放到哪里,看哪边的合计金额小,放到哪里,继续。

直到一边的长度满了为止。剩下的放到另外一个列表。

原理:大数产生差额,小数填平差额。

def eval_list(a:list,b:list):
    if len(a)!=len(b):
        print('长度不一致') #类型错误未检测。
        return 0
    x=sorted(a+b,reverse=True)
    c,d=[x[0]],[x[1]]
    for i in range(2,len(x)):
        print('-len-',len(x),'cs',sum(c),'ds',sum(d),'-c-',c,'-d-',d)
        if len(d)<len(a) and sum(c)>sum(d):
            d.append(x[i])
        elif len(c)<len(a) and sum(c)<=sum(d):
            c.append(x[i])
        elif len(d)==len(a):
            c+=x[i:]
            break
        elif len(c)==len(a):
            d+=x[i:]
            break
    x=[]
    print('sumc',sum(c),'c',c,'\n','sumd',sum(d),'d',d,'\n','最小差额',abs(sum(c)-sum(d)))
eval_list([11,2,55,100,700],[3,600,12,1275,1000])

  

 

posted on 2018-01-01 00:31  guangzhao17  阅读(614)  评论(0编辑  收藏  举报