给定一组非0整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最小的整数。
注意:
-
输入整数数组中,可能存在负数,但最多只会有一个负数
-
输出结果可能非常小,所以你需要返回一个字符串而不是整数。
输入格式:
一个整数数组,每个元素其间以“空格”分隔
输出格式:
最小数的字符串
输入样例1:
在这里给出一组输入。例如:
10 2
输出样例1:
在这里给出相应的输出。例如:
102
输入样例2:
在这里给出一组输入。例如:
3 30 34 5 -9
输出样例2:
在这里给出相应的输出。例如:
-9534330
要解决这个问题,我们需要对给定的整数数组进行重新排列,使得它们组成的数字最小。由于输入可能包含负数,并且输出结果可能非常小,我们需要返回一个字符串而不是整数。
### 解决思路
1. **处理负数**:如果数组中存在负数,我们需要将其单独处理,因为负数会影响排序的结果。
2. **排序规则**:对于非负数部分,我们需要定义一个排序规则,使得连接后的结果最小。具体来说,对于两个数 `a` 和 `b`,如果 `a + b` 的字典序小于 `b + a`,则 `a` 应该排在 `b` 前面。
3. **拼接结果**:将排序后的数组拼接成一个字符串,并将负数(如果存在)放在最前面。
### 代码实现
以下是 Python 代码实现:
```python
from functools import cmp_to_key
def compare(a, b):
# 自定义比较函数
if a + b < b + a:
return -1
elif a + b > b + a:
return 1
else:
return 0
def smallest_number(nums):
# 将所有数字转换为字符串
str_nums = list(map(str, nums))
# 检查是否存在负数
negative_num = None
for num in str_nums:
if num[0] == '-':
negative_num = num
str_nums.remove(num)
break
# 对非负数部分进行排序
str_nums.sort(key=cmp_to_key(compare))
# 拼接结果
result = ''.join(str_nums)
# 如果存在负数,将其放在最前面
if negative_num:
result = negative_num + result
return result
# 读取输入
input_str = input().strip()
nums = list(map(int, input_str.split()))
# 计算并输出结果
print(smallest_number(nums))
```
### 代码解释
1. **自定义比较函数**:`compare` 函数用于比较两个字符串 `a` 和 `b`,根据 `a + b` 和 `b + a` 的字典序来决定它们的顺序。
2. **字符串转换**:将所有整数转换为字符串,以便进行字符串比较。
3. **处理负数**:检查数组中是否存在负数,如果存在,将其单独取出。
4. **排序**:使用自定义的比较函数对非负数部分进行排序。
5. **拼接结果**:将排序后的字符串数组拼接成一个结果字符串。如果存在负数,将其放在最前面。
6. **输出结果**:返回拼接后的结果字符串。
### 输入输出示例
- 输入样例1: `10 2`
- 输出样例1: `102`
- 输入样例2: `3 30 34 5 -9`
- 输出样例2: `-9534330`
这个方法能够处理包含负数的情况,并且确保输出结果是最小的整数形式。