19.剑指offer-把数组排成最小的数

来源:互联网 发布:mac safari下载速度慢 编辑:程序博客网 时间:2024/06/18 08:25

1.题目

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

2. 基本思路

​ 我们将输入数组变换成字符串,如果我们能事先对其排序,如{‘3’,’32’,‘321’}排序成{‘321’,‘32’,’3‘},则最后再将排序好的字符串重新串连起来,那么就为要求的输出。

​ 给定数字a,数字b,我们将其变成字符串。ab表示a加在b的前面,ba表示b加在a的前面。如a=’1’ ,b=’23’, 那么ab=’123’,ba=‘231’

新的字符串比较规则如下:
这里写图片描述

3.代码

  • C++
  bool cmp(const string&s1,const string&s2)  {        bool res=true;          string t1=s1+s2;          string t2=s2+s1;        return t1<t2;  }  string PrintMinNumber(vector<int> numbers) {          string res;          if(numbers.empty())          {            return res;              }          vector<string> source(numbers.size());          char a[32];          int i=0;          for(;i<numbers.size();++i)          {            sprintf(a,"%d",numbers[i]);                 source[i]=a;           }          sort(source.begin(),source.end(),cmp);          print(source);          res=source[0];          i=1;          while(i<source.size())          {            res+=source[i++];        }         return res;  }
  • python (python3中重定义比较规则和C++中sort函数不一样;并且python3中list的sort函数取消了cmp这个参数,无法将在函数中定义的规则直接传入,需要借助functools
  # -*- coding:utf-8 -*-  import functools  def cmp1(a,b):      t1=a+b      t2=b+a      if t1<t2:          return -1      elif t1==t2:          return 0      elif t1>t2:          return 1  class Solution:      def PrintMinNumber(self, numbers):          # write code here          numbers=[str(s) for s in numbers]          numbers.sort(key=functools.cmp_to_key(cmp1))          return "".join(numbers)

0 0
原创粉丝点击