華為Python 算法面試題


華為算法面試題 

"""
算法題:
    提供一個序列,完成對這個序列的分割。要求分割后的兩個序列彼此差值最小
    實現函數,返回兩個序列
"""


def func(i):
    i.sort()
    if not i:
        return (([], []))

    max_num = i[-1]
    max_two_num = i[-2]
    max_list, min_list = func(i[:-2])
    max_list.append(max_two_num)
    min_list.append(max_num)

    if sum(max_list) > sum(min_list):
        return ((max_list, min_list))
    else:
        return ((min_list, max_list))


l = [1, 46, 3, 8, 6, 4561, 4642, 45, 8, 9, 155, 1784]
print(len(l))
l1, l2 = func(l)
print(l1, l2)

 

 上面題目存在 問題必須要求 提供的序列是 偶數元素。

如果奇數元素,因為每次遞歸減少2個元素。

最后一個元素的時候,無法對第二個元素取值導致報錯

因此如果題意改動,可以使用以下版本

"""
算法題:
    提供一個序列,完成對這個序列的分割。要求分割后的兩個序列彼此差值最小
    實現函數,返回兩個序列
"""


def func(i):
    if not i:
        return ([], [])
    elif len(i) == 2:
        return (i[1:], i[0:])
    elif len(i) == 1:
        return (i[0:], [])
    else:
        max_num = i[-1]

        max_two_num = i[-2]

        max_list, min_list = func(i[:-2])
        max_list.append(max_two_num)
        min_list.append(max_num)

        if sum(max_list) > sum(min_list):
            return (max_list, min_list)
        return (min_list, max_list)


# tests = [
#     [1, 2, 3, 5, 6, 7, 8],
#     [15446, 13, 165468, 113216, 1654613, 11, 132, 135416, 54],
#     range(1, 10)]

# for i in tests:
#     i.sort()
#     list_max, list_min = func(i)

l = [1, 46, 3, 8, 6, 4654, 45, 456546, 1313, 1321, 8, 9, 155]
l.sort()
print(len(l))
l1, l2 = func(l)
print(l1, l2)
print(sum(l1), sum(l2))
13
[1, 3, 8, 45, 46, 1321, 456546] [6, 8, 9, 155, 1313, 4654]
457970 6145

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM