题目要求:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路:按位比较
代码:
class Solution:
def PrintMinNumber(self, numbers):
if numbers:
num_str = [list(i) for i in map(str,numbers)]
res = []
while num_str:
max_len = max(map(len,num_str))#控制字符串的比较次数
td_list = [i for i in num_str]#辅助栈,控制每次比较的字符串
for i in range(max_len):
cur_char = [jj[min(i,len(jj)-1)] for jj in td_list]
#比较,找最小值对应的索引和值
min_char = min(enumerate(cur_char), key=lambda x:x[1])
min_index,min_val = min_char[0],min_char[1]
#看有没有跟最小的相等的
min_nums = cur_char.count(min_val)
if min_nums == 1:
#只有一个最小值,则输出
break
else:
#将与最小的相等的几个字符串取出来,放入辅助栈中,进行进一步的比较
new_td_list = []
for index,val in enumerate(cur_char):
if val == min_val:
new_td_list.append(td_list[index])
td_list = new_td_list
res.append(int(''.join(td_list[min_index])))
num_str.pop(num_str.index(td_list[min_index]))# 将已经算出来的值pop出来,剩下的值进一步比较,直到所有的值都比较完
res = ''.join([i for i in map(str, res)])
return res
else:
return ''
牛客上有人给出了很牛的一个算法,巧用sort函数
相关博客可以看:http://www.jb51.net/article/52730.htm
# -*- coding:utf-8 -*- class Solution: def PrintMinNumber(self, numbers): # write code here string_numbers = [str(num) for num in numbers] string_numbers.sort(self.compare) return "".join(string_numbers) def compare(self, str1, str2): new_str1 = str1 + str2 new_str2 = str2 + str1 return cmp(new_str1, new_str2)