题目描述:

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

  解题思路:

  本题最直观的解法就是求出数组中所有数字的全排列,然后比较所有的排列,最后找到最小的排列,但是时间复杂度为O(n!),所以不是一个好的解法。

  换一种思路可以发现,本题实际上希望我们找到一个排序规则,数组根据这个排序规则进行重排之后可以连成一个最小的数字。要确定这样的排序规则,也就是对于两个数字m和n,通过一个规则确定哪个应排在前面。

  根据题目要求,我们可以发现,两个数字m和n能拼接成mn和nm,如果mn<nm,那m应该在前;如果nm<mn,那么n应该在前。因此,我们得到的排序规则如下:

  • 若mn>nm,则m大于n
  • 若mn<nm,则m小于n
  • 若mn=nm,则m等于n

  根据上述规则,我们需要先把数字转换成字符串再进行比较,因为需要拼接起来。比较完之后按顺序连接成一个字符串即可。

  编程实现(Java):

import java.util.*;

public class Solution {
class compareStr implements Comparator<String>{
@Override
public int compare(String m,String n) {
String mn=m+n,nm=n+m;
return mn.compareTo(nm); //mn小于nm返回-1,等于返回0,大于返回1
}
} public String PrintMinNumber(int [] numbers) {
String result="";
if(numbers==null||numbers.length<=0)
return result;
int len=numbers.length;
String[] str=new String[len];
for(int i=0;i<len;i++)
str[i]=String.valueOf(numbers[i]);
compareStr c=new compareStr();
Arrays.sort(str,c); for(String s:str)
result += s;
return result;
}
}

最新文章

  1. 微信小程序的机会在于重新理解群组与二维码
  2. Apache漏洞修复
  3. 起因:dell超级密码算号器 1F66
  4. sqlserver 查询库中有多少张表
  5. UVA 12898 And Or 数学暴力
  6. Python&#39;s Exception 层级结构
  7. C++14介绍
  8. (转).net webconfig使用IConfigurationSectionHandler自定section
  9. ubuntu11.10server 安装redis-2.6.7
  10. UltraEdit MAC破解方法
  11. 2018-2019-2 《Java程序设计》第2周学习总结
  12. QT开发基础教程
  13. cacati的安装
  14. PHP实现登录功能DEMO
  15. 最近遇到的几个纯C编程的陷阱
  16. 九度oj 1002 Grading 2011年浙江大学计算机及软件工程研究生机试真题
  17. Linux 上安装 weblogic12C (远程图形界面安装) (二)
  18. is char signed or unsigned?
  19. rem怎么计算
  20. .net 4 安装未成功,无意中的解决办法!

热门文章

  1. Eclipse启动时提示fail to create the Java Virtual Machine问题的解决
  2. HDU 2206 IP的计算(字符串处理)
  3. select readonly 不能看到其它选项解决方式
  4. Codeforces 2018-2019 ICPC, NEERC, Southern Subregional Contest
  5. bzoj5192: [Usaco2018 Feb]New Barns
  6. Codeforces--630N--Forecast(方程求解)
  7. 【POJ 1964】 City Game
  8. yii 面包屑
  9. 用CSS伪类制作一个不断旋转的八卦图?
  10. 利用set特性判断list是否存在重复的值