博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(python版)《剑指Offer》JZ32:把数组排成最小的数
阅读量:4089 次
发布时间:2019-05-25

本文共 4083 字,大约阅读时间需要 13 分钟。

在这里插入图片描述
本质上是一个排序问题

【思路1】快速排序

排序判断规则: 设 nums 任意两数字的字符串格式 a 和 b ,则

  • 若ab > ba 则 a “大于” b,<b在前 a在后>
  • 若ab < ba 则 a “小于” b,<a在前 b在后>
  • 若ab = ba 则 a “等于” b.

在这里插入图片描述

class Solution:    def minNumber(self, nums: List[int]) -> str:        def fast_sort(l , r):            if l >= r: return            i, j = l, r            while i < j:                while strs[j] + strs[l] >= strs[l] + strs[j] and i < j: j -= 1                while strs[i] + strs[l] <= strs[l] + strs[i] and i < j: i += 1                strs[i], strs[j] = strs[j], strs[i]            strs[i], strs[l] = strs[l], strs[i]            fast_sort(l, i - 1)            fast_sort(i + 1, r)                strs = [str(num) for num in nums]        fast_sort(0, len(strs) - 1)        return ''.join(strs)'''作者:jyd链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/solution/mian-shi-ti-45-ba-shu-zu-pai-cheng-zui-xiao-de-s-4/来源:力扣(LeetCode)'''

在这里插入图片描述

In [1]: nums = [3,30,34,5,9]                                                                                                                                      In [16]:In [2]: strs = [str(num) for num in nums]In [3]: strsOut[3]: ['3', '30', '34', '5', '9']

【思路2】py内置函数 sort,cmp_to_key

class Solution:    def minNumber(self, nums: List[int]) -> str:        def sort_rule(x, y):            a, b = x + y, y + x            if a > b: return 1            elif a < b: return -1            else: return 0                strs = [str(num) for num in nums]        strs.sort(key = functools.cmp_to_key(sort_rule))        return ''.join(strs)'''作者:jyd链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/solution/mian-shi-ti-45-ba-shu-zu-pai-cheng-zui-xiao-de-s-4/来源:力扣(LeetCode)''''''

sort方法的key参数 需要设置一个函数,这个函数返回元素参与大小比较的值

在这里插入图片描述
的机制还是不太了解

它接受两个参数,对它们进行比较,并返回 一个负数表示小于零表示相等,或者一个正数表示大于

键函数是一个可调用的函数,它接受一个参数并返回另一个值作为 排序键 使用。

=============================

3 和 30比较, -1是指要交换
34 和 3、30比较,返回1,表示34比他们大,都不交换
5为什么跟3、34比较呢?

  • 比较的是前两个就好了么?
  • 那为什么先跟3比较,而不是34?5比34大的话,就是比3大了呀。

9为什么也只跟前两个比?跟5比较,大的话,直接放后面了呀,怎么先跟34比?

==============================

以上是我的疑问,哪位路过的大佬可以赐教一二?

在这里插入图片描述

【附】思路1的打印版

class Solution:    def minNumber(self, nums):        def fast_sort(l , r):            print('此时l=%d,r=%d'%(l,r))            if l >= r:                 print('提前结束')                return            i, j = l, r            while i < j:                while strs[j] + strs[l] >= strs[l] + strs[j] and i < j:                     # print('%s >= %s'%(strs[j] + strs[l],strs[l] + strs[j]))                    print('%s %s >= %s %s'%(strs[j],strs[l],strs[l],strs[j]),end='\t')                    j -= 1                    print('l=%d, 新j=%d'%(l,j))                while strs[i] + strs[l] <= strs[l] + strs[i] and i < j:                     print('%s %s <= %s %s'%(strs[i],strs[l],strs[l],strs[i]),end='\t')                    i += 1                    print('l=%d, 新i=%d'%(l,i))                strs[i], strs[j] = strs[j], strs[i]                print('i j 相遇:交换 %s 和 %s'%(strs[i],strs[j]))                print('现在strs = ',strs)            strs[i], strs[l] = strs[l], strs[i]            print('交换  %s 和 %s'%(strs[i],strs[l]))            print('获得排好的j前面序列,现在strs = ',strs)            print('\n')            fast_sort(l, i - 1)            print('左半部分')            fast_sort(i + 1, r)            print('右半部分')                strs = [str(num) for num in nums]        print('原strs = ',strs)        fast_sort(0, len(strs) - 1)        return ''.join(strs)s = Solution()nums = [3,30,34,5,9]s.minNumber(nums)

思路2的打印版

class Solution:    def minNumber(self, nums):        def sort_rule(x, y):            a, b = x + y, y + x            print('\na=%s,b=%s'%(a,b))            if a > b:                 print('返回1')                return 1            elif a < b:                 print('返回-1')                return -1            else:                 print('返回0')                return 0                strs = [str(num) for num in nums]        print('原strs = ',strs)        strs.sort(key = functools.cmp_to_key(sort_rule))        print('最后的strs = ',strs)        return ''.join(strs)s = Solution()nums = [3,30,34,5,9]s.minNumber(nums)

转载地址:http://zfjii.baihongyu.com/

你可能感兴趣的文章
苹果新系统遭吐槽!SSH 默认规则被破坏,程序员无法登录 Web 服务器...
查看>>
卧槽!小姐姐用动画图解 Git 命令,这也太秀了吧?!
查看>>
厉害了!Python 编辑器界的神器 Jupyter ,推出官方可视化 Debug 工具!
查看>>
你的银行账户信息,可能正被人拿到暗网上公开售卖!
查看>>
太赞啦!GitHub 重磅宣布,私有仓库将对外免费开放,不限人数!
查看>>
我用 Python 分析了 “青你 2” 漂亮小姐姐的颜值,结果真香!
查看>>
这款开源神器,让你能在 iPad 上随心所欲写代码!
查看>>
卧槽!Java 虚拟机竟然还有这些性能调优技巧...
查看>>
JavaScript 诞生的这 20 年来,都发生了什么...
查看>>
听说玩这些游戏能提升编程能力?
查看>>
7 年工作经验,面试官竟然还让我写算法题???
查看>>
被 Zoom 逼疯的歪果仁,造出了视频会议机器人,同事已笑疯丨开源
查看>>
上古语言从入门到精通:COBOL 教程登上 GitHub 热榜
查看>>
哈哈哈哈,「00 后黑话破解器」火爆 GitHub,这波操作我给满分!
查看>>
再见,Eclipse...
查看>>
超全汇总!B 站上有哪些值得学习的 AI 课程...
查看>>
网络协议那些事儿,每一个程序员的必备知识,这次终于理顺了!
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
神器面世:让你快速在 iOS 设备上安装 Windows、Linux 等操作系统!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>