练习五十一:序列交换

Posted pinpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了练习五十一:序列交换相关的知识,希望对你有一定的参考价值。

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

  1 def list_end(list1,list2):
  2     if len(list1) == len(list2):
  3         old_num = abs(sum(list1)-sum(list2))
  4         l = len(list1)
  5         x,y = 0,0
  6         flag = 1
  7         while flag:
  8             min_num = old_num
  9             while x < l:
 10                 while y < l:
 11                     list1[x],list2[y] = list2[y],list1[x] #先交换,在计算sum和的差值
 12                     temp = abs(sum(list1)-sum(list2))
 13                     if min_num > temp: #如果差值比原本的小
 14                         min_num = temp  #原本的就等于现在的
 15                     else:
 16                         list1[x],list2[y] = list2[y],list1[x]  #否则还原回去
 17                     y += 1
 18                 y = 0
 19                 x += 1
 20             if min_num == old_num:
 21                 flag = 0
 22         return list1,list2
 23     else:
 24         return ‘提供的列表必须长度相同‘
 25 
 26 list1 = [99,98,89,12]
 27 list2 = [5,4,22,11]
 28 print(list_end(list1,list2))
 29 print(abs(sum(list1)-sum(list2)))

执行结果:

([4, 98, 89, 5], [99, 12, 22, 11])
52

以上是关于练习五十一:序列交换的主要内容,如果未能解决你的问题,请参考以下文章

大数据必学Java基础(五十一):什么是算法和数据结构

测开之路五十一:代码实现MongoDB增删改查

剑指offer五十一之构建乘积数组

Vue2.0学习—组件(五十一)

Axure RP从入门到精通(五十一)案例 - 超链接

shell编程题(五十一)