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


京公网安备 11010502036488号