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

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

只能想到最傻的办法


import random

import time


def timeit(func):
    def _deco(*args, **kwargs):
        start = time.clock()
        d = func(*args, **kwargs)
        end = time.clock()
        print "used time: %s" % str(end - start)
        return d
    return _deco

@timeit

def exchange(lsta, lstb):

    suma = sum(lsta)

    sumb = sum(lstb)
    d = abs(suma-sumb)
    if d == 0:
        return d
    
    bExchange = False    
    for indexa, ia in enumerate(lsta):
        if d == 0:
            break
        for indexb, ib in enumerate(lstb):
            tempd = abs((suma-ia+ib)-(sumb+ia-ib))
            if tempd < d:
                bExchange = True
                tempindexa = indexa
                tempindexb = indexb
                d = tempd

        if bExchange:
            suma = suma - lsta[tempindexa] + lstb[tempindexb]
            sumb = sumb - lstb[tempindexb] + lsta[tempindexa]
            tempv = lsta[tempindexa]
            lsta[tempindexa] = lstb[tempindexb]
            lstb[tempindexb] = tempv
            bExchange = False
        
    return d
lsta = []
lstb = []
for i in range(1000):
    lsta.append(random.randint(0, 1000000))
for i in range(1000):
    lstb.append(random.randint(0, 1000000))

print exchange(lsta,lstb)

lsta = []
lstb = []
for i in range(10000):
    lsta.append(random.randint(0, 1000000))
for i in range(10000):
    lstb.append(random.randint(0, 1000000))

print exchange(lsta,lstb)
=======================================================
分别测试一千个数和一万个数的结果,一万个数时耗时真多。
>>> 
used time: 0.223763605341
3
used time: 46.6022585932
1
>>> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值