关于一道面试题的解答(华为公司python面试题,要求10分钟写出代码)

题目:

有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;

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

思路:

1 两个序列什么时候和差值最小?

我的思考是 (1)两个序列和差值小于等于1,此事无论怎么交换,肯定无法更小了。

                       (2)和值大的那方任意元素与和值小的那方任意元素之差不小于两个序列和之差,则无法更小了

                                  比如 sum(a) > sum(b)  且 diff = sum(a)-sum(b) , 任意元素之差>=diff 则此时和差值最小。

在此基础上,实现代码如下,但最后还是觉得思路上有问题,因为有可能正好某几个元素之和的差小于diff,这种情况存在吗?

代码:

from random import randint
def get_list(num = 5):
    li = [randint(0, 100) for i in range(num)]
    return li
def cal_min_diff(l_max, l_min):
    while True:
        l_max.sort(reverse=True)
        l_min.sort()
        sum1 = sum(l_max)
        sum2 = sum(l_min)
        diff = sum1 - sum2
        if diff < 0:
            temp = l_min
            l_min = l_max
            l_max = temp

        diff = abs(diff)
        if diff <= 1:
            break
        b_find = False
        for j in range(len(l_min)):
            for i in range(len(l_max)):
                val = l_max[i] - l_min[j]
                if val < diff and val > 0:
                    b_find = True
                    break
            if b_find == True:
                break
        if b_find == False:
            break
       temp = l_max[i]
        l_max[i] = l_min[j]
        l_min[j] = temp
    l_max.sort()
    l_min.sort()
    return (l_max, l_min, diff)
if __name__ == '__main__':
    l1 = get_list(10)
    l2 = get_list(10)
    print 'origin data'
    print l1
    print l2
    print '='*20
    l_max, l_min, min_diff = cal_min_diff(l1,l2)
    print 'final data'
    print l_max
    print l_min
    print 'the minimal difference is ',min_diff



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值