剑指offer 面试33 把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,
例如输入数组 {3, 32, 321},则打印出这 3 个数字能排成的最小数字 321323。
package algorithm.foroffer.top40;
import java.util.*;
/**
* Created by liyazhou on 2017/5/30.
* 面试题33:把数组排成最小的数
*
* 题目:
* 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,
* 例如输入数组 {3, 32, 321},则打印出这 3 个数字能排成的最小数字 321323。
*
* 考查点:
* 1. 字符串排序,// 字典顺序排序(字典序顺序排序,字典序逆序排序)
* 2. 比较器
*
* 思路:
* 1. 将数组中所有的整数转换为字符串
* 2. 比较两个字符串A、B的大小(谁排在前,谁排在后)的原则:
* 比较 A+B 和 B+A,让两者按字典序排序的准则,返回大小值(后验),
* A、B 依据返回的结果进行排序
*/
public class Test33 {
public static void cancatMinNumber(int[] array){
List<String> dictOrderList = new LinkedList<>();
for (int element: array)
dictOrderList.add(element + "");
Collections.sort(dictOrderList, new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return (o1+o2).compareTo(o2+o1);
}
});
for (String num: dictOrderList)
System.out.print(num);
}
public static void main(String[] args){
int[][] arrays = {
{3, 32, 323},
{31, 32, 323},
};
for(int[] array: arrays){
System.out.println(Arrays.toString(array));
cancatMinNumber(array);
System.out.println();
}
}
}
和以上大致相同的解法。
(2017-8-15 10:12:35)
import java.util.*;
public class Solution {
public String PrintMinNumber(int [] numbers) {
// List<Integer> list = Arrays.asList(numbers);
Integer[] array = new Integer[numbers.length];
for(int i = 0; i < numbers.length; i ++)
array[i] = numbers[i];
Comparator<Integer> cmp = new Comparator<Integer>(){
@Override
public int compare(Integer t1, Integer t2){
int num1 = Integer.valueOf("" + t1 + t2); // 代表t1放在前面
int num2 = Integer.valueOf("" + t2 + t1); // 代表t2放在前面
int result = 0;
if (num1 > num2) result = 1; // 升序排序,t1+t2较大,则t1放后面
else if (num1 < num2) result = -1; // 升序排序,t1+t2较小,则t1放前面
return result;
}
};
Arrays.sort(array, cmp);
StringBuilder s = new StringBuilder();
for (int i = 0; i < array.length; i ++)
s.append(array[i]);
return s.toString();
}
}