1. 题目描述
描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
2. 题目解析
2.1 考察问题
考察字符串比较和排序算法思想。
首先,此问题最终结果可能会超过int得上限,所以不能考虑用整数来存储拼接值,所以考虑用字符串来处理。
其次,我总纠结于类似num1, num2, num3相互之间比较,比如num1本应该排在num2前边,但是可能加上num3就会排到后边。这种思想不正确,反而让自己思路全无。
以分治思想考察,多个num相互拼接,本质上可以等价于两个num相互拼接,哪个大哪个放前边,所以就类似排序思想了。
2.2 解决办法
- 字符串比较+冒泡排序
比较num1-num2与num2-num1的大小,哪个大哪个放前边。
按照冒泡排序思想,从大到小排序即可。
这里需要注意,字符串比较,在java和python中都有相应的字符串比较函数,其比较思想都是逐字符比较,等于输出0,大于输出大于0,小于输出小于0。
3. 代码实现
3.1 维数组计数
# -*- coding:utf-8 -*-
class Solution:
def PrintMinNumber(self, numbers):
# write code here
str_num = [str(x) for x in numbers]
for i in range(0, len(numbers)):
for j in range(0, len(numbers) - i - 1):
if (str_num[j] + str_num[j+1]) > (str_num[j+1] + str_num[j]):
str_num[j], str_num[j+1] = str_num[j+1], str_num[j] ### python特有的交换方式, 当然你可以考虑使用sort自带函数排序,但是并不能减小时间复杂度,只算是取巧而已
return "".join(str_num)