本文算法使用python3实现


1 题目描述:

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

  时间限制:1s;空间限制:32768K


2 思路描述:

  大致思路

  (1)我们可以先思考只有两个数字的情况: $ [3,32] $ ,可以看出来 $ 332 > 323 $ 因此需要把数组改变为 $ [32,3] $ ;

  (2)对于有三个数字的情况: $ [3,32,321] $ 我们两两进行比较, $ 332 > 323 $ 于是,将 $ 3 $ 与 $ 32 $ 交换位置变成 $ [32,3,321] $ 而 $ 3321 > 3213 $ 于是将 $ 3 $ 与 $ 321 $ 继续交换位置到 $ [32,321,3] $ ;接着我们继续使用 $ 32 $ 进行比较,由于 $ 32321 > 32132 $ 将 $ 32 与 321 $ 进行位置交换为 $ [321,32,3] $ 此时,将数组链接起来变成 $ 321323 $ 即为最小的数。

  具体思路

  (1)先将数字列表转化成字符串链表,这样便于在一个字符串后面直接加上另外一个字符串。也就是 $ "3" + "321" = "3321" $ 。

  (2)构造一个比较函数,当 $ str1 + str2 > str2 + str1 $ 时我们认为字符串 $ str1 > str2 $ 。

  (3)将字符串列表按照比较函数的规定进行冒泡排序(或其它方法排序),将定义为”大”的字符串放到最后。而”小”的字符串放在前面。最后将字符串列表链接起来,便是所求。

  注意:在python2.x中可直接对 sort() 函数进行比较函数cmp的传参,可以利用sort()函数直接对字符串列表进行排序。但是,对于python3.x取消了sort()函数中的cmp参数


3 程序代码:

(1)方法一:

class Solution:
def theMax(self, str1, str2):
'''定义字符串比较函数'''
return str1 if str1+str2 > str2+str1 else str2 def PrintMinNumber(self, numbers):
"""使用冒泡进行排序(把最大的放最后)"""
string = [str(num) for num in numbers]
res = []
flag = True
count = len(string) - 1
while flag and count > 0:
flag = False
for i in range(len(string)-1):
if self.theMax(string[i], string[i+1]) == string[i]:
temp = string[i]
del string[i]
string.insert(i+1, temp)
flag = True
count -= 1
string = ''.join(string)
return string

(3)方法二(仅python2.x可用):

class Solution:
def cmp(self, a, b):
'''定义比较函数'''
ab = int(a+b)
ba = int(b+a)
return 1 if ab > ba else -1 def PrintMinNumber(self, numbers):
string = [str(num) for num in numbers]
string.sort(self.cmp, reverse=True)
return ''.join(string)

最新文章

  1. 初识Hadoop、Hive
  2. jQuery中怎样阻止后绑定事件
  3. OC基础(21)
  4. vs2015web工程中的html引用压缩后css后无法智能提示的问题解决
  5. css常用属性2
  6. (原创)遗传算法C++实现
  7. C# & JAVA:读写文件
  8. 关键字(4):grant授权/revoke回收权限
  9. 【MyEclipse】JSP默认打开方式 设置(双击)
  10. _instance_reset
  11. 新增html5标签 例如input的很多属性
  12. 2018.09.25 51nod1597 有限背包计数问题(背包+前缀和优化)
  13. 设计模式——门面模式(Facade)
  14. PHP安装扩展mcrypt以及相关依赖项 【PHP安装PECL扩展的方法】
  15. 【jQuery】jQuery中的事件捕获与事件冒泡
  16. 随性练习:python字典实现文本合并
  17. hadoop FileSystem类和SequenceFile类实例
  18. jquery 通过ajax 提交表单
  19. HDU 5512 Pagodas【博弈】
  20. jvm实例的个数

热门文章

  1. ORALCE表的约束条件
  2. sea.js模块化工具
  3. linux (ubuntu)安装pycharm
  4. SpaceVim 语言模块 python
  5. Scala快速入门到精通 视频教程 百度云网盘下载地址
  6. 北京Uber优步司机奖励政策(11月2日~11月8日)
  7. 我错了的N个学习
  8. nodejs 实现套接字服务
  9. 图的基本算法(BFS和DFS)
  10. 「国庆训练」ArcSoft's Office Rearrangement(HDU-5933)