• 把数组排成最小的数


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

    方法一
    最直接的一种方法就是类似于之前有道题“字符串的全排列”,先求出数组中所有数字的全排列,然后把每个排列拼起来,秋后求出拼起来的数字的最小值。但是n个数字总共有n!个排列。我没有实现这个方法。

    方法二

    先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。
    排序规则如下:

    • 若ab > ba 则 a > b,
    • 若ab < ba 则 a < b,
    • 若ab = ba 则 a = b;

    解释说明:

    • 比如 “3” < "31"但是 “331” > “313”,所以要将二者拼接起来进行比较.
    	public String PrintMinNumber(int [] numbers) {
    		if(numbers == null || numbers.length <= 0) {
    			return "";
    		}
    		ArrayList<Integer> list = new ArrayList<Integer>();
    		for (int i = 0; i < numbers.length; i++) {
    			list.add(numbers[i]);
    		}
    
    		Collections.sort(list, new Comparator<Integer>() {
    
    			public int compare(Integer str1, Integer str2) {
    				String s1 = str1 + "" + str2;
    				String s2 = str2 + "" + str1;
    				return s1.compareTo(s2);
    			}
    		});
    
    		String str = "";
    
    		for (Integer i : list) {
    			str += i;
    		}
    		return str;
    
    	}
    

    注意自定义排序的时候compareTo()方法的作用:
    返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方。

    • 如果参数字符串等于此字符串,则返回值 0;
    • 如果此字符串小于字符串参数,则返回一个小于 0 的值;
    • 如果此字符串大于字符串参数,则返回一个大于 0 的值。
  • 相关阅读:
    $动态规划系列(1)——金矿模型的理解
    $Java HttpClient库的使用
    $Java-json系列(二):用JSONObject解析和处理json数据
    $百度应用引擎BAE的使用与应用部署
    利用ajax短轮询+php与服务器交互制作简易即时聊天网站
    MYSQL explain详解
    Redis 5种数据结构使用及注意事项
    Redis 存储机制
    memcache
    mysql分表和表分区详解
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707689.html
Copyright © 2020-2023  润新知