• 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
  • 刚开始想着将数组中的元素,按个十百...拆分,存入集合,然后在比较集合看哪个适合放在前面;最终因逻辑复杂,放弃,看题解,按别人思路实现了一下;
  • 方法一思路:
    • 将numbers[i]和number[j]转成string类型,然后加和,比较number[i] + "" + number[j]和number[j] + "" + number[i],如果前者大于后者,不交换,否则numbers[i]和numbers[j]位置互换;
public class Solution {
    public String PrintMinNumber(int[] numbers) {

        int len = numbers.length;
        if (len == 0) return "";
        if (len == 1) return String.valueOf(numbers[0]);
        for (int i = 0; i < len; i++) {
            for (int j = i + 1; j < len; j++) {

                long value1 = Integer.valueOf(numbers[i] + "" + numbers[j]);
                long value2 = Integer.valueOf(numbers[j] + "" + numbers[i]);

                if (value1 > value2){
                    swapIndex(numbers, i, j);
                }
            }
        }

        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < len; i++) {
            stringBuffer.append(numbers[i]);
        }

        return stringBuffer.toString();

    }

    private void swapIndex(int[] numbers, int i, int j) {

        int temp = numbers[j];
        numbers[j] = numbers[i];
        numbers[i] = temp;
    }
}
  • 方法二思路:

    • 将数组所有元素转成String,并放入集合ArrayList<string>中;</string>

    • 使用Collections.sort()方法对集合排序;

    • 比较集合元素先后顺序,如果各个位置上对比之后分不出大小,长度较短的需要循环对比;

      public String PrintMinNumber(int[] numbers) {
      
        ArrayList<String> arrayLists = new ArrayList<>();
        int len = numbers.length;
      
        for (int i = 0; i < len; i++) {
            arrayLists.add(String.valueOf(numbers[i]));
        }
      
        Collections.sort(arrayLists, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
      
                int i = 0, j = 0;
                int maxLength = Math.max(o1.length(), o2.length());
                while (i < maxLength && j < maxLength) {
                    if (i == o1.length()) i = 0;
                    if (j == o2.length()) j = 0;
      
                    if (o1.charAt(i) < o2.charAt(j)){
                        return -1;
                    }else if (o1.charAt(i)>o2.charAt(j)){
                        return 1;
                    }
                    i++;
                    j++;
                }
      
      
            return 0;
        }
    });

    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < len; i++) {
        stringBuffer.append(arrayLists.get(i));
    }

    return stringBuffer.toString();

}