📅  最后修改于: 2023-12-03 15:28:27.688000             🧑  作者: Mango
给定一个n位数,可以通过交换其中的数字来得到一个新的数。求通过交换数字能够得到的最大回文数。
用桶来存储每个数字出现的次数,然后从9到0遍历每个数字,每次取出该数字尽可能多的放在奇数位或者偶数位上,尽可能让原来的低位数字变成高位数字,同时保证新生成的数是回文数即可。
def max_palindrome(n, nums):
# nums存储每个数字出现的次数
nums = [0] * 10
for i in range(n):
nums[int(input())] += 1
# 将对应的数字和出现次数放入buckets中
buckets = []
for num, freq in enumerate(nums):
if freq > 0:
buckets.append((num, freq))
# 从9到0遍历每个数字
ans = [0] * n
l, r = 0, n - 1
for num in range(9, -1, -1):
for i in range(len(buckets)):
if buckets[i][0] == num:
digit, freq = buckets.pop(i)
while freq > 1 and l < r:
ans[l] = ans[r] = digit
l += 1
r -= 1
freq -= 2
if freq:
# 如果还有一个数没有用完,则放在中间的位置
if l == r:
ans[l] = digit
else:
ans[l] = ans[r] = digit
l += 1
r -= 1
break
# 拼接每个数字为字符串
result = ''.join(map(str, ans))
return result if is_palindrome(result) else '-1'
时间复杂度为O(10n),其中n为数字的位数。