算法题-把数组排成最小的数

40 篇文章 0 订阅
38 篇文章 0 订阅

把数组排成最小的数
时间限制:1秒空间限制:32768K
算法知识视频讲解
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

思路一

首先我们很容易想到全排列,但全排列时间复杂度为O(n!)。
所以在这里我们需要根据题意发现其中数学规律,然后定义一个规则,对拼接后的字符串进行比较。

这里排序规则如下:

◾若ab > ba 则 a 大于 b,
◾若ab < ba 则 a 小于 b,
◾若ab = ba 则 a 等于 b;

根据上述规则,我们需要先将数字转换成字符串再进行比较。比较完之后,按顺序输出即可。

C++

 class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        int length = numbers.size();
        if(length == 0){
            return "";
        }
        sort(numbers.begin(), numbers.end(), cmp);
        string res;
        for(int i = 0; i < length; i++){
            res += to_string(numbers[i]);
        }
        return res;
    }
private:
    // 升序排序
    static bool cmp(int a, int b){
        string A = to_string(a) + to_string(b);
        string B = to_string(b) + to_string(a);
        return A < B;
    }
};

python
1.运用lambda表达式结合cmp()函数及串的”+”操作,完成对数组内每两个串相”加:(连)后结果进行比较的过程,之后sorted()对数组内所有数进行排序后返回 ,join函数拼接后输出

先放一下代码:

# -*- coding:utf-8 -*-  
class Solution:
    def PrintMinNumber(self, nums):
        if len(nums) == 0:
            return ''
        comp = lambda a, b:cmp(str(a) + str(b), str(b) + str(a))
        min_str = sorted(nums, cmp = comp)
        return ''.join(str(string) for string in min_str)
Python cmp() 函数
  • 描述

    cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。
    
  • 语法

    cmp( x, y )
    
  • 参数

    x – 数值表达式。
    y – 数值表达式。

  • 返回值

    如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。

Python sorted() 函数
>sorted() 函数对所有可迭代的对象进行排序操作。
  • 语法

    sorted 语法:

    sorted(iterable[, cmp[, key[, reverse]]])
  • 参数说明:

    iterable -- 可迭代对象。
    
    cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
    
    key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    
    reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
    
  • 返回值

    返回重新排序的列表list。
    

例:
sorted()函数对list进行排序:

   sorted([36, 5, -12, 9, -21])
    #输出[-21, -12, 5, 9, 36]
  • 这里需要提一下的是python中的内建排序函数有 sort、sorted两个。
关于sorted(iterable,cmp,key,reverse)

1、基础的序列升序排序直接调用sorted()方法即可
例子:

     ls = list([5, 2, 3, 1, 4])
     new_ls = sorted(ls)
     #或者使用ls.sort()即可,直接将ls改变
     print(new_ls)
需要注意:sort()方法仅定义在list中,而sorted()方法对所有的可迭代序列都有效,并且针对任何的可迭代序列,sorted()都是返回一个list,
print(sorted({8: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}))
输出为:[2, 3, 4, 5, 8]
  • 2、使用cmp函数排序,cmp是带两个参数的比较函数

这也是该解法中所用到的方式,相当方便灵活,可以指定传入对象内的某个元素某部分进行比较并返回值从而影响排序结果

list1 = [('david', 90), ('mary',90), ('sara',80),('lily',95)]

print(sorted(list1,cmp = lambda x,y: cmp(x[0],y[0])))#按照第一个位置的字母序排序

#输出[('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]

print(sorted(list1,cmp = lambda x,y: cmp(x[1],y[1])))#按照第二个位置的数字序排序

#输出[('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]
  • 3、添加key参数,key 是带一个参数的函数

    list.sort()和sorted()函数使用key参数来指定一个函数,此函数将在每个元素比较前被调用。
    

    例如通过key指定的函数来忽略字符串的大小写

1 print(sorted("This is a test string from Andrew".split(), key=str.lower))
2 #输出为:['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
  • 4、用reverse排序
 print(sorted(list1,reverse = True))#逆转

#输出[('sara', 80), ('mary', 90), ('lily', 95), ('david', 90)]
sort 与 sorted 区别:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

Python join()函数以及lambda表达式

join()在python中主要是用来格式化做字符串拼接,而lambda其实是起到一个函数速写的作用,允许方便简洁的在代码内嵌入一个函数的定义(但在有些情况下会导致代码可读性降低,所以建议在逻辑有限的情况下使用lambda表达式,如果逻辑过于复杂,代码阅读起来会相对困难)。在之前的博客里中已经已经有过详细介绍,这里不再赘述

join()函数
https://blog.csdn.net/ego_bai/article/details/80481262

lambda表达式
https://blog.csdn.net/ego_bai/article/details/80521657

再放一次代码:

# -*- coding:utf-8 -*-  
class Solution:
    def PrintMinNumber(self, nums):
        if len(nums) == 0:
            return ''
        comp = lambda a, b:cmp(str(a) + str(b), str(b) + str(a))
        min_str = sorted(nums, cmp = comp)
        return ''.join(str(string) for string in min_str)

思路二:

将数组中的数字转换成string进行操作比较,比较规定如下
任意两个str1 和str2进行比较
首先连接成

 num1 = str1+str2 
 num2 = str2+str1 

转换成int型

 ① intnum1 > intnum2 str1>str2 
 ② intnum1 < intnum2 str2>str1 
 ③ intnum1==intnum2 str1=str2

代码:

# -*- coding:utf-8 -*-  
class Solution:  
    def PrintMinNumber(self, numbers):  
        if not numbers:  
           return ''  
        numstr = map(str,numbers) #用str方式将int型数字转换成string  
        l = lambda n1,n2:int(n1+n2)-int(n2+n1)# 指定比较方式  
        numsort = sorted(numstr,cmp=l) #用特定的比较方式进行比较  
          return "".join(i for i in numsort) #拍完序之后用join进行连接成结果  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值