[剑指Offer]-把数组排成最小的数字

    xiaoxiao2025-05-17  5

    题目描述

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

    核心在于自定义一个排序规则

    解题思路

    若ab > ba 则 a > b 若ab < ba 则 a < b若ab = ba 则 a = b解释说明:a = 21b = 2因为 212 < 221, 即 ab < ba ,所以 a < b所以我们通过对ab和ba比较大小,来判断a在前或者b在前的。
    算法图解

    比较简单不做图了!

    参考代码:
    package offer; import java.util.Arrays; import java.util.Comparator; /** * 把数组排成最小的数字 */ public class Offer45 { public static void main(String[] args) { int num[] = {3, 32, 321}; PrintMinNumber(num); } /** * 若ab > ba 则 a > b * 若ab < ba 则 a < b * 若ab = ba 则 a = b * 解释说明: * a = 21 * b = 2 * 因为 212 < 221, 即 ab < ba ,所以 a < b * 所以我们通过对ab和ba比较大小,来判断a在前或者b在前的。 * * @param numbers * @return */ public static String PrintMinNumber(int[] numbers) { int len = numbers.length; if (len == 0) return ""; if (len == 1) return String.valueOf(numbers[0]); StringBuffer res = new StringBuffer(); String[] str = new String[len]; for (int i = 0; i < len; i++) { str[i] = String.valueOf(numbers[i]); } Arrays.sort(str, new Comparator<String>() { public int compare(String s1, String s2) { String c1 = s1 + s2; String c2 = s2 + s1; return c1.compareTo(c2); } }); for (int i = 0; i < len; i++) res.append(str[i]); return res.toString(); } }
    附录

    该题源码在我的 ?Github 上面!

    最新回复(0)