把数组排成最小的数

题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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 的值。
posted @ 2019-03-26 22:20  如是说  阅读(621)  评论(0编辑  收藏  举报