傳說中的華爲Python筆試題——兩等長整數序列互換元素,序列和的差值最小(修正)

有兩個序列a,b,大小都爲n,序列元素的值任意整形數,無序;
要求:經過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。

1. 將兩序列合併爲一個序列,並排序,獲得sourceList
2. 拿出最大元素Big,次大的元素Small
3. 在餘下的序列S[:-2]進行平分,獲得序列max,min
4. 將Small加到max序列,將Big加大min序列,從新計算新序列和,和大的爲max,小的爲min。 html

 

以下,提供遞歸版本和迭代版本的解體思路:python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#########################################################################
# File Name: minDistance.py
# Author: lpqiu
# mail: qlp_1018@126.com
# Created Time: 2014年10月27日 星期一 05時19分45秒
#########################################################################

# recusive version
def minDist(sortedList):
    if not sortedList:
        return ([], [])

    large = sortedList[-1]
    secondLarge = sortedList[-2]

    largeList, smallList = minDist(sortedList[:-2])
    largeList.append(secondLarge)
    smallList.append(large)
    #print('LargeList:', largeList, 'SmallList', smallList)

    if sum(largeList) > sum(smallList):
        return (largeList, smallList)
    else:
        return (smallList, largeList)

# iteriation version
def minDistIterVer(sortedList):
    largeList, smallList = [], []

    for i in range(0, len(sortedList), 2):
        if sum(largeList) > sum(smallList):
            largeList.append(sortedList[i])
            smallList.append(sortedList[i + 1])
        else:
            largeList.append(sortedList[i + 1])
            smallList.append(sortedList[i])

    if sum(largeList) > sum(smallList):
        return (largeList, smallList)
    else:
        return (smallList, largeList)

def testMain(listA, listB):                     # len(listA) == len(listB) = n
    print("Sorted List: ", sorted(listA + listB))
    largeList, smallList = minDist(sorted(listA + listB))
    print(largeList, smallList, "distance: ", sum(largeList) - sum(smallList))

    largeListIterVer, smallListIterVer = minDistIterVer(sorted(listA + listB))
    print(largeListIterVer, smallListIterVer, "distance: ", sum(largeListIterVer) - sum(smallListIterVer))


if __name__ == "__main__":
    listA = [1,-1,2,3,6,189]; listB = [2,3,4,6,7,123]
    testMain(listA, listB)
相關文章
相關標籤/搜索