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