算法-把数组排成最小的数

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

/**
  核心思想是,比较a和b,把他们拼起来,ab和ba哪个大,如果a大于b,那么交换。
  这样一遍循环,可以将最大的放到数组最后,多循环几次,就是我们想要的数组,输出即可。
*/
public static String PrintMinNumber(int[] numbers) {
  for (int i = numbers.length; i > 0; i--) {
        for (int j = 0; j < i - 1; j++) {
            compareAndSwap(numbers, j, j + 1);
        }
    }
    return toString(numbers);
}

private static void compareAndSwap(int[] n, int i, int j) {
    Long ab = Long.valueOf(n[i] + "" + n[j]);
    Long ba = Long.valueOf(n[j] + "" + n[i]);
    if (ab > ba) {
        n[i] = n[i] ^ n[j];
        n[j] = n[i] ^ n[j];
        n[i] = n[i] ^ n[j];
    }
}

private static String toString(int[] numbers) {
    StringBuilder b = new StringBuilder();
    for (int number : numbers) {
        b.append(number);
    }
    return b.toString();
}

posted @ 2020-02-25 21:52  慢慢行  阅读(21)  评论(0编辑  收藏  举报