此题解的核心思想是首先将数字转换为字符串以便操作其各个数字。对于正数,找到第一个非零的最小数字作为最小值的首位,然后将剩余数字升序排序并拼接在后面。对于负数,找到最大的数字作为首位,然后将剩余数字降序排序并拼接在后面,最终加上负号,以确保得到的负数尽可能小。如果数字为0,直接返回0。
时间复杂度: O(n log n)
空间复杂度: O(n)
class Solution:
def smallestNumber(self, num: int) -> int:
if num == 0:
return 0 # 如果数字是0,直接返回0
elif num < 0:
s = str(num)[1:] # 去掉负号
index = s.index(max(s)) # 找到最大的数字的索引,作为负数的最小值的首位
min_value = int("-" + str(s[index]) + "".join(sorted(s[:index] + s[index + 1:], reverse=True))) # 降序排序剩余部分
else:
s = str(num)
index = s.index(min(s, key=lambda x: x if x != "0" else "9")) # 找到第一个非零的最小数字,避免前导零
min_value = int(str(s[index]) + "".join(sorted(s[:index] + s[index + 1:]))) # 升序排序剩余部分
return min_value # 返回结果