- 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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(); }