leetcode
leetcode 1901 ~ 1950
重排数字的最小值

重排数字的最小值

难度:

标签:

题目描述

代码结果

运行时间: 25 ms, 内存: 16.0 MB


解释

方法:

此题解的核心思想是首先将数字转换为字符串以便操作其各个数字。对于正数,找到第一个非零的最小数字作为最小值的首位,然后将剩余数字升序排序并拼接在后面。对于负数,找到最大的数字作为首位,然后将剩余数字降序排序并拼接在后面,最终加上负号,以确保得到的负数尽可能小。如果数字为0,直接返回0。

时间复杂度:

O(n log n)

空间复杂度:

O(n)

代码细节讲解

🦆
在处理正数和负数时,为什么选择不同的排序方式(升序对正数,降序对负数)?
在处理正数时,我们希望数字尽可能小,因此将数字升序排列可以使得较小的数字放在前面,从而形成最小的正数。而在处理负数时,我们需要的是绝对值最小的负数,即尽可能接近零的负数。将数字降序排列后,较大的数字会放在前面,使得负数的绝对值尽可能小。
🦆
如果所有数字都相同,例如输入为1111或-2222,算法会如何处理这种情况?
如果所有数字都相同,无论是正数1111还是负数-2222,排序后的结果仍然是相同的数字顺序。对于正数1111,找到最小的非零数字后进行排序,结果依然是1111。对于负数-2222,找到最大的数字进行降序排序,结果也是-2222。因此,算法在这种情况下会返回输入数字的原值。
🦆
在查找最小或最大数字时,`index`函数是否会抛出异常,例如当所有数字都是0时?
在查找最小或最大数字时,如果所有数字都是0,例如输入为0或-0(虽然-0等同于0),在正数处理逻辑中,`min`函数会通过lambda函数将'0'视为'9'进行比较,确保不选择0作为首位,但仍然能找到0因为它是唯一的选择。在负数处理逻辑中,使用`max`函数查找最大数字时,因为所有数字都是0,所以会返回0,不会抛出异常。
🦆
对于负数处理,选择最大的数字作为首位后,为什么剩余部分要进行降序排序而不是升序排序?
对于负数处理,选择最大的数字作为首位是为了使负数的绝对值尽可能小(即负数尽可能接近零)。在这之后,将剩余部分进行降序排序可以保证较大的数字靠前,从而使得整个负数的绝对值最小。如果采用升序排序,剩余较小的数字会靠前,使得负数的绝对值增大,这与我们希望得到尽可能小的负数的目标相悖。

相关问题