61 lines
1.5 KiB
Python
61 lines
1.5 KiB
Python
def solution(l):
|
|
remain = sum(l) % 3
|
|
if remain == 0:
|
|
largest_number = get_largest_number(l)
|
|
return largest_number
|
|
|
|
(category_0, category_1, category_2) = split_digits_by_remain_of_three(l)
|
|
if remain == 1:
|
|
category_1, category_2 = remove_one_or_two_digits(category_1, category_2)
|
|
else:
|
|
category_2, category_1 = remove_one_or_two_digits(category_2, category_1)
|
|
if (category_1 == False) or (category_2 == False):
|
|
return 0
|
|
largest_number = get_largest_number(category_0 + category_1 + category_2)
|
|
return largest_number
|
|
|
|
def split_digits_by_remain_of_three(nums):
|
|
result = ([], [], [])
|
|
for n in nums:
|
|
result[n%3].append(n)
|
|
return result
|
|
|
|
def remove_one_or_two_digits(list1, list2):
|
|
if len(list1) >= 1:
|
|
return sorted(list1)[1:], list2
|
|
if len(list2) >= 2:
|
|
return list1, sorted(list2)[2:]
|
|
return False, False
|
|
|
|
def get_largest_number(nums):
|
|
if len(nums) == 0:
|
|
return 0
|
|
return int(''.join([str(x) for x in sorted(nums, reverse=True)]))
|
|
|
|
test_cases=[
|
|
[3, 1, 4, 1],
|
|
[3, 1, 4, 1, 5, 9],
|
|
[5, 5],
|
|
[0, 0, 9,9,9,9,9,9,9,9,7],
|
|
[0, 0, 0,0,0,0],
|
|
[0, 0, 0,0,0,0, 1, 1, 1],
|
|
[1],
|
|
[1, 1],
|
|
[1, 2],
|
|
[1, 1, 1],
|
|
[],
|
|
[0],
|
|
[1, 2, 3],
|
|
[1, 2, 3, 4],
|
|
[1, 2, 3, 4, 5],
|
|
[3, 3, 3, 0, 1, 1, 2, 2],
|
|
[3, 3, 3, 0, 1, 2, 2],
|
|
[3, 3, 3, 0, 1, 1, 2],
|
|
[1, 0, 0, 0],
|
|
[2, 0, 0, 0],
|
|
[3, 0, 0, 0, 6],
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
|
|
]
|
|
for test in test_cases:
|
|
print(test, solution(test))
|