【剑指offer】把数组排成最小的数(python)

题目描述:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

解题思路:

本题我用到了简单排序的思想,经过比较之后选择出最小的,然后与当前的置换。

比较的方法,以 3和32为例

如果3 * 100 + 32 > 32 * 10 + 3,则32排在前面,很容易理解,3和32有两种排法,分别为332和323,显然32放前面的时候值比较小。

实现比较的代码:

        for i in range(len(numbers)):
            t = numbers[i]
            m = i 
            for j in range(i + 1, len(numbers)):
                if t * pow(10, len(str(numbers[j]))) + numbers[j] > numbers[j]* pow(10, len(str(t))) + t:
                    t = numbers[j]
                    m = j
            if i != m:
                temp = numbers[i]
                numbers[i] = t
                numbers[m] = temp

排序之后,将numbers数组中所有的元素组装起来即可,组装的代码:

        length = 0
        for ele in numbers:
            length += len(str(ele))
        r = 0
        for ele in numbers:
            r += ele * pow(10, length - len(str(ele)))
            length -= len(str(ele))

完整代码:

# -*- coding:utf-8 -*-
class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        if not numbers:
            return ""
        for i in range(len(numbers)):
            t = numbers[i]
            m = i 
            for j in range(i + 1, len(numbers)):
                if t * pow(10, len(str(numbers[j]))) + numbers[j] > numbers[j]* pow(10, len(str(t))) + t:
                    t = numbers[j]
                    m = j
            if i != m:
                temp = numbers[i]
                numbers[i] = t
                numbers[m] = temp
        length = 0
        for ele in numbers:
            length += len(str(ele))
        r = 0
        for ele in numbers:
            r += ele * pow(10, length - len(str(ele)))
            length -= len(str(ele))
        return r

 

全部评论

相关推荐

05-04 09:38
已编辑
门头沟学院 引擎开发
个人9本海硕,本硕期间一直在投游戏相关实习/校招,岗位由客户端->引擎->TA->AIGC。最终目标肯定是独游制作人,所以程序策划美术都点了些,感觉也没谁了。值此春招末尾总结下技术向校招要点,算是回馈牛客社区了。也附上我的Github和个人博客,欢迎各种交流讨论。 前言 首先是个人惯例的劝退游戏行业。参见缅怀故人 和永远有多远 ,相比于互联网,游戏薪资大概相当但要求更高,加班严重且更为局限。如果你只是带着一腔热情想入这行,建议先找个日常实习了解下真实的游戏行业再做选择。 准备 当然,在你决定踏出这步后,第一步就是准备相关的笔试面试。这里先建议找到你感兴趣的公司岗位的JD,然后...
牛客28967172...:说的还是有道理的,我校招时就拿到过网易雷火好几个顶级项目组方向的offer,基本上流程和你说的一样。 但本质还是劝退互联网的游戏方向,本质上是代价更高,而且职业生涯容错率很低,方向比较窄。 代价是众所周知的严重加班,游戏大版本赶工基本上通宵无休,甚至国庆五一都没放假是常态。 职业生涯性价比低是因为游戏行业本质上就是赢家通吃,但你要跳槽只有腾讯网易等头部,要么就是米哈游莉莉丝库洛三七等少数中厂,然后就没了,公司是断崖的少 游戏开发相比互联网方向岗位非常非常少,比如网易整个雷火也才五六百人,里面十几个工作室,招人比例非常低,其他游戏公司也是一样。 而且方向也很窄,你做引擎开发就只能跳相关,你做游戏客户端也只能跳相关(游戏客户端都算吃香的,但市场hc也非常非常少,跳槽机会更少),基本上很难转回互联网 这里对比传统互联网,大厂多的都说不过来,而且容错率很大,你做搜索方向可以跳推荐,你做推荐方向可以跳广告,要求远没有游戏行业那么严,甚至你之前干测试都能跳槽研发方向
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务