把数组排成最小的数
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
示例1
输入
[3,32,321]
返回值
“321323”
解题思路:
- 暴力法:先进行全排列,然后找到最小的那个。
参考字符串的排列的思路。即,先固定其中一个元素,然后对剩下的元素进行排列。
如:"abc"
先固定"a",对"bc"进行排序。同理固定"b",对"ac"排序。【递归条件】
当数组只含有一个元素时,返回该值。【基线条件】
代码:
class Solution:
def PrintMinNumber(self, numbers):
if not numbers:
return ""
if len(numbers) == 1:
return str(numbers[0])
#全排列
def solution(array):
if len(array)<2:
return array
result = []
for first in range(len(array)):
for new in solution(array[:first]+array[first+1:]):
tmp = str(array[first]) + str(new)
if tmp not in result:
result.append(tmp)
return result
result = solution(numbers)
#找到最小的那个值
value = result[0]
for i in range(1,len(result)):
if int(result[i]) < value:
value = int(result[i])
return value
- 将数组中的数字连接起来,排成一个最小的数字。我们需要将“大数”往后放,“小数”往前放。
如何定义’大数’和’小数’?比如说有两个数a和b,如果ab>ba则a是’大数’b是’小数’,要排成ba。
于是,这道题目变成了一个排序问题,用冒泡排序。
代码:
def PrintMinNumber(self, numbers):
if not numbers:
return ""
if len(numbers) == 1:
return str(numbers[0])
#冒泡排序
flag = 1
while flag == 1:
flag = 0
for i in range(len(numbers)-1):
#ab
tmp1 = str(numbers[i]) + str(numbers[i+1])
#ba
tmp2 = str(numbers[i+1]) + str(numbers[i])
if tmp1 > tmp2:
tmp = numbers[i]
numbers[i] = numbers[i+1]
numbers[i+1] = tmp
flag = 1
#将从小到大排好序的数组按顺序输出
result = ""
for i in numbers:
result += str(i)
return result