[剑指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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值