[剑指Offer][Python]

题目要求:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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)

猜你喜欢

转载自blog.csdn.net/jillian_sea/article/details/80369760