剑指offer 面试33 把数组排成最小的数

来源:互联网 发布:miss外设淘宝店网址 编辑:程序博客网 时间:2024/06/06 06:29

剑指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();    }}
阅读全文
1 0
原创粉丝点击