[微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小_利用排列组合思路解决_python版

(原题出自微软公司面试题)问题如下:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。例如:a=[100,99,98,1,2, 3]b=[1, 2, 3, 4,5,40]

题目是看到QQ群友发的,网上也百度了下目前已经有好几种解法了。写了半天有点晕,后面忽然想到中学时候数学里面的排列组合的方法。方法对于较短的list可行,长list组合情况太多,可能耗时太长或溢出。
 1 from itertools import combinations
 2
 3 def get_combinations(arr):
 4     """获取所有组合结果,结果是生成器形式"""
 5     arr.sort(reverse=True) # 从大到小排序
 6     for x in combinations(arr[1:], len(arr[1:]) // 2):
 7         yield arr[0:1] + list(x) #捆绑法,捆绑一个最大值
 8
 9 def get_abs_mins(avs,arr):
10     """返回各个list平均值与所有数平均值差的绝对值迭代对象"""
11     for x in arr:
12         abs_min = abs(sum(x)/len(x)-avs)
13         yield abs_min
14         if abs_min == 0: #绝对值为0时,停止比较
15             break
16
17 def run(arr1,arr2):
18     arr = arr1 + arr2 #合并list
19     avs = sum(arr) / len(arr)  # 求所有数的平均值
20     abs_min = min(get_abs_mins(avs, get_combinations(arr)))  # 求组合后的平均值与所有值平均值差的最小值
21
22     i = 1
23     for x in get_combinations(arr):
24         if abs(sum(x) / len(x) - avs) == abs_min:
25             x_ = arr[:]
26             for e in x:
27                 x_.remove(e) #删除x中的元素
28             # i为比较次数,x是第一个list,x_是第2个list
29             print("循环次数:%s\nlist1:%s\nlist2:%s\nlist1求和:%s\nlist2求和:%s"%(i,list(x),x_,sum(x),sum(x_)))
30             return x,x_
31             break
32         i += 1
33
34 if __name__ == ‘__main__‘:
35     a = [100, 99, 98, 1, 2, 3]
36     b = [1, 2, 3, 4, 5, 40]
37     try:
38         x,x_ = run(arr1=a,arr2=b)
39         # print(x)
40         # print(x_)
41     except:
42         pass

运行结果:

循环次数:337
list1:[100, 40, 5, 4, 3, 3]
list2:[99, 98, 2, 2, 1, 1]
list1求和:155
list2求和:203

改变a、b的值

a = [100, 99, 98, 1, 2, 3] + [(i+2)*(i+7) for i in range(6)]

b = [1, 2, 3, 4, 5, 40] + [(i+2)**2 for i in range(6)]

运行结果:

循环次数:201546
list1:[100, 99, 98, 66, 5, 4, 4, 3, 3, 2, 1, 1]
list2:[84, 50, 49, 40, 36, 36, 25, 24, 16, 14, 9, 2]
list1求和:386
list2求和:385
时间: 2024-10-12 08:50:25

[微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小_利用排列组合思路解决_python版的相关文章

【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)

32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[100,99,98,1,2,3];var b=[1,2,3,4,5,40]; 首先,目标一定是先找到n个数字,使得数字和比总和的一半小,但是最接近. 思路一:开始看这道题跟之前学的动态规划很像,就想用动态规划来解.但是....做不出来........... 必须要选一半的数字让我头都大了. 思路二:

通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小

题目描述: 有两个序列a,b,大小都为n,序列元素的值任意整数,无序:要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小.例如:var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40]; 分析: 很多情况下,贪心算法得到的解并不是最优解,但是这道题貌似是最优解 思想:每次从AB中找到两个使得和之差最小的元素交换 当前和之差diff=sumA-sumB,从A中找到一元素a,从B中找到一元素b,如果交换那么就须有(sumA

有两个数组a,b,大小都为n,数组元素的值任意整形数,无序,通过交换a,b中的元素,使得|sum(a)-sum(b)|最小

有两个数组a,b,大小都为n,数组元素的值任意整形数,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小. 令A=sum(a)-sum(b) a的第i个元素和b的第j个元素交换后,a和b的和之差为 A'= sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i])           = sum(a) - sum(b) - 2 (a[i] - b[j])           = A - 2 (a[i] - b[j]) 设x = a[

[算法]判断两个字符串是否由相同的字符组成

如何判断两个字符串是否由相同的字符组成 题目描述: 由相同的字符组成是指组成两个字符串的字母以及各个字母的个数是一样的,只是排列顺序不同而已.例如"aaaabbc"与"abcbaaa"就由相同的字符组成的. 方法一: 排序法,将两个字符串中的字符排序,比较两个排序后的字符串是否相等.若相等则表明它们是由相同的字符组成的,否则,表明他们是由不同的字符组成的. import java.util.Arrays; public class Solution { public

有两个数组a,b,大小都为n,;通过交换a,b中的元素,使sum(a)-sum(b)最小。

有两个数组a,b,大小都为n,数组元素的值任意整形数,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小. 当前数组a和数组b的和之差为    A = sum(a) - sum(b) a的第i个元素和b的第j个元素交换后,a和b的和之差为    A' = sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i])           = sum(a) - sum(b) - 2 (a[i] - b[j])           = A

[算法]求栈中最小元素

如何用O(1)的时间复杂度求栈中最小元素 解题思路: 我们经常会采用空间换取时间提高时间复杂度.我们可以使用两个栈结构,一个栈用来存储数据,另一个栈用来存储栈中的最小元素.思路如下:如果当前入栈的元素比原来栈中的最小值还小,则把这个值压入保存最小元素的栈中:在出栈时,如果当前入栈的元素恰好为当前栈中的最小值,保存最小值的栈顶元素也出栈,使得当前最小值变为其入栈之前的那个最小值. 实现代码如下: package 求栈中最小元素; /** * 用链表方式实现栈 * @author dream * *

[翻译]The Neophyte's Guide to Scala Part 12: Type Classes

The Neophyte's Guide to Scala Part 12: Type Classes 过去的两周我们讨论了一些使我们保持DRY和灵活性的函数式编程技术,特别是函数组合,partial function的应用,以及currying.接下来,我将会继续讨论如何使你的代码尽可能的灵活. 但是,这次我们将不会讨论怎么使用函数作为一等对象来达到这个目的,而是使用类型系统,这次它不是阻碍着我们,而是使得我们的代码更灵活:你将会学到关于 type classes 的知识. 你可能会觉得这是一

[转载]矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先

[转载]http://www.xuebuyuan.com/882848.html (一)首先,无论dx还是opengl,所表示的矢量和矩阵都是依据线性代数中的标准定义的:“矩阵A与B的乘积矩阵C的第i行第j列的元素c(ij)等于A的第i行于B的第j列的对应元素乘积的和.”(实用数学手册,科学出版社,第二版)例如c12 = a11*b11+a12*b21+a12*b13... (二)在明确了这一点后,然后我们再看“矩阵的存储方式”,矩阵存储方式有两种,一种是“行主序(row-major order

MongoDB入门教程三[数据类型]

MongoDB的文档使用BSON(Binary JSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null.布尔.数字.字符串.数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供日期.32位数字.64位数字等类型.以下对mongoDB的类型进行简要说明: 1. Null[类型编号:10] null类型用于表示空值或不存在的字段,如:{“x”:null} 2. 布尔类型 Boolean[类型编号:8] 布尔类型有两上值,’true