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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值