2231. 按奇偶性交换后的最大数字 - 力扣(LeetCode)


我们要从给定的整数 num 中通过 任意次数的相同奇偶性数字的交换,得到一个最大的可能值。
换句话说,奇数之间可以任意换,偶数之间也可以任意换,目标是让这个数最大。
✅ 解题思路:
-
将
num转换成字符串,方便逐位处理。 -
将其中的 奇数位 和 偶数位 分别提取出来,排序(从大到小)。
-
从左到右重新构造这个数字:
-
如果当前数字是奇数,则从排序好的奇数列表中取最大的;
-
如果是偶数,则从排序好的偶数列表中取最大的。
-
💡 示例:
比如 num = 65875:
-
数字拆分为:
[6, 5, 8, 7, 5] -
奇数位数字:
[5, 7, 5]→ 排序后:[7, 5, 5] -
偶数位数字:
[6, 8]→ 排序后:[8, 6]
然后我们按照原顺序重构:
-
原顺序第 1 位是 6(偶数) → 用最大偶数 8
-
原顺序第 2 位是 5(奇数) → 用最大奇数 7
-
原顺序第 3 位是 8(偶数) → 用次大偶数 6
-
原顺序第 4 位是 7(奇数) → 用次大奇数 5
-
原顺序第 5 位是 5(奇数) → 用剩下的奇数 5
结果:[8, 7, 6, 5, 5] → 87655
✅ Python 实现:
def largest_integer(num: int) -> int:
digits = list(str(num))
odds = sorted([int(d) for d in digits if int(d) % 2 == 1], reverse=True)
evens = sorted([int(d) for d in digits if int(d) % 2 == 0], reverse=True)
result = []
for d in digits:
if int(d) % 2 == 0:
result.append(str(evens.pop(0)))
else:
result.append(str(odds.pop(0)))
return int(''.join(result))
1255

被折叠的 条评论
为什么被折叠?



