zoukankan      html  css  js  c++  java
  • 把数组排成最小的数

    题目描述
    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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 的值。
  • 相关阅读:
    OO术语表
    linux之用户管理(useradd/usermod/userdel/groupadd/groupmod/groupdel)
    Linux 线程绑核
    g++中数组定义时长度可以使用变量
    水滴石穿之C语言的底层操作(移位操作有效位数)
    ACE
    Oracle优化器介绍
    SQL优化工具
    Oracle Index 索引介绍(SQL)
    VC6.0:"Setup was unable to create a DCOM user account"的解决方案
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707689.html
Copyright © 2011-2022 走看看