题目:

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

题目解析:

  看到这道题最直接的方法是先求出这个数组中所有数字的全排列,然后将每一种去安排列拼接,然后从拼接中找出最小的数,但是这样的效率明显较低,那么有咩有高效的方法呢?当然有,就是定义一个排序的规则。要定义一个排序的规则,就要比较两个数,假设这两个数是m和n,我们需要确定一个规则来决定那个应该排在前面,这里不仅仅是要对数值的比较。
  根据题目的要求,两个数字m和n能拼成数字mn和nm,如果mn>nm,我们就应该让n在前m在后,也就是定义n小于m,反之同理。如果mn=nm,就要定义n等于m。
  接下来就要考虑怎么去拼接数字,如果是两个int类型的直接拼接,很有可能就溢出了,所以我们要使用字符串去拼接。既然这样,我们就应该在开始将数组中的整数转换为字符串,这样在拼接的时候就方便多了,并且不用考虑溢出的问题。
  一个有效的比较规则需要满足三个条件:自反性、对称性和传递性,那么我们就来证明一下:
  自反性:显然有 aa=aa ,所以a = a;
  对称性:如果a > b,则有ab > ba,所以ba > ab,则有b > a;
  传递性:如果a > b,则有ab > ba。假设a和b用十进制表示时各自有 x位和y位,于是ab = ax10y+b,ba = bx10x+a;传递性如下图:

所以这个比较规则有效。

代码解析:
class Solution {public://排序规则static bool cmp(int a, int b){string A = "";string B = "";A+=to_string(a);A+=to_string(b);B+=to_string(b);B+=to_string(a);return A<B;}string PrintMinNumber(vector<int> numbers) {if(numbers.empty())return "";string ret = "";sort(numbers.begin(),numbers.end(),cmp);for(size_t i = 0; i < numbers.size(); ++i)ret += to_string(numbers[i]);return ret;}
};

把数组排列成最小的数(详解)相关推荐

  1. PAT甲级1038 Recover the Smallest Number (30 分):[C++题解]贪心、排列成最小的数、字符串

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 贪心: 对于字符串a和b,如果 a+b < b+a (这里+代表字符串中的连接)代表字典序更小.举例 a = 321 , b ...

  2. 如何求数组中绝对值最小的数?

    """ 有一个升序排列的数组,数组中可能有正数,负数或0,求数组中元素的绝对值最小的数.例如,数组[-10,-5,-2,7,15,50],该数组中绝对值最小的数是2 &q ...

  3. java的数组与Arrays类源码详解

    java的数组与Arrays类源码详解 java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 类的 ...

  4. Python Numpy多维数组.sum(axis=0/1/2...) 详解

    Python Numpy多维数组.sum(axis=0/1/2-) 详解 numpy中axis取值的说明 首先对numpy中axis取值进行说明:一维数组时axis=0,二维数组时axis=0,1,维 ...

  5. JS逆向之补环境过瑞数详解

    JS逆向之补环境过瑞数详解 "瑞数" 是逆向路上的一座大山,是许多JS逆向者绕不开的一堵围墙,也是跳槽简历上的一个亮点,我们必须得在下次跳槽前攻克它!! 好在现在网上有很多讲解瑞数 ...

  6. IIS连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解

    IIS:连接数.并发连接数.最大并发工作线程数.应用程序池的队列长度.应用程序池的最大工作进程数详解 iis性能指标的各种概念:连接数.并发连接数.最大并发工作线程数.应用程序池的队列长度.应用程序池 ...

  7. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

  8. php 去重_php求两数组交集的四种方法详解

    题目:给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1],nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5 ...

  9. html标签非成对,深入document.write()与HTML4.01的非成对标签的详解

    深入document.write()与HTML4.01的非成对标签的详解 (一)HTML4.01中的非成对标签: 注释标签: 严格来讲不算HTML标签的:文档声明标签 设置页面元信息的:标签 设置网页 ...

最新文章

  1. java学mybatis还用学jdbc吗,mybatis系统学习(二)——使用基础mybatis代替原始jdbc
  2. 你的设备中缺少重要的安全和质量修复_城市排水管道三类非开挖修复技术汇总...
  3. 基于Java的音频转发服务器_javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)...
  4. matlab读int16读文件_matlab文件读写.doc.doc
  5. rust(12)-闭包,闭包作为返回值,闭包作为参数
  6. Struts2 action的单例与多例
  7. not enough arguments for format string
  8. Springboot07配制数据统一返回格式以及定义统一的异常处理类
  9. c语言函数编写格式,在c语言中如何实现函数模板?
  10. 当SQLServer判断不等于遇到null的时候
  11. 查看系统信息msinfo32工具的使用
  12. android matrix 亮度,Android ColorMatrix 亮度矩阵 对比度矩阵 黑白矩阵 -电脑资料
  13. 术语-MOSS-微软协作工具:MOSS(微软协作工具)
  14. 外星人显卡拓展坞支持linux,今天,你给信仰充值了么?ALIENWARE 外星人 显卡扩展坞 简单开箱...
  15. 开源项目学习-V部落
  16. 2122 分解质因数
  17. 华为mate40pro鸿蒙冷散热,华为mate40pro曝光,2K屏+麒麟9000+鸿蒙系统+双6400万,售价感人...
  18. 实例072计算工资 己知某公司员工的工资底薪为500元, 员工销售的软件金额与提成方式如下销售额<=2000 没有提成 2000<销售
  19. socket通信之六:Overlapped I/O 事件通知模型实现的客户/服务器模型
  20. “对不起,您只能拨打中国移动的号码…”

热门文章

  1. 掌握神经网络,我应该学习哪些至关重要的知识点?
  2. Spring Boot中使用log4j实现http请求日志入mongodb
  3. DataMan-美团旅行数据质量监管平台实践
  4. Nature发布第一张人类造血干细胞发育的全面路线图
  5. MongoDB安装启动教程
  6. CSS 小结笔记之文字溢出处理
  7. python——面向对象相关
  8. Python爬虫入门四之Urllib库的高级用法
  9. 了解Web及网络基础——《图解http》第一章
  10. git stash简介