47 把数组排成最小的数--剑指offer--python实现

1. 题目描述

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

2. 题目解析

2.1 考察问题

  考察字符串比较和排序算法思想。
  首先,此问题最终结果可能会超过int得上限,所以不能考虑用整数来存储拼接值,所以考虑用字符串来处理。
  其次,我总纠结于类似num1, num2, num3相互之间比较,比如num1本应该排在num2前边,但是可能加上num3就会排到后边。这种思想不正确,反而让自己思路全无。
  以分治思想考察,多个num相互拼接,本质上可以等价于两个num相互拼接,哪个大哪个放前边,所以就类似排序思想了。

2.2 解决办法

  1. 字符串比较+冒泡排序
      比较num1-num2与num2-num1的大小,哪个大哪个放前边。
      按照冒泡排序思想,从大到小排序即可。
      这里需要注意,字符串比较,在java和python中都有相应的字符串比较函数,其比较思想都是逐字符比较,等于输出0,大于输出大于0,小于输出小于0。

3. 代码实现

3.1 维数组计数

# -*- coding:utf-8 -*-
class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        str_num = [str(x) for x in numbers]
        for i in range(0, len(numbers)):
            for j in range(0, len(numbers) - i - 1):
                if (str_num[j] + str_num[j+1]) > (str_num[j+1] + str_num[j]):
                    str_num[j], str_num[j+1] = str_num[j+1], str_num[j] ### python特有的交换方式, 当然你可以考虑使用sort自带函数排序,但是并不能减小时间复杂度,只算是取巧而已
        return "".join(str_num)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值