华为面试题,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])

  

 

转载于:https://www.cnblogs.com/guangzhao17/p/8159563.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值