看到这个题目,就想到先写一个样例,然后找规律:
{30, 32};
分析:第一位3相同,第二位0在前
{3, 32, 321, 30, 311};
分析:第一位3相同,再分析第二位:第二位没有;第二位比第第一位大时或比第一位小时;第二位相同...
{30, 301, 30301};
分析:前两位相同...
经过一系列简单的分析,就可以找到一个贪心策略,把数组排成最小的数。
// 做题要多看题解,看别人的思路,而不仅仅是AC!
// 通过上述的分析,写了一个递归比较两个数:30,30301
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
public static String PrintMinNumber(int[] numbers) {
Integer[] nums = new Integer[numbers.length];
for (int i = 0; i < numbers.length; i++) {
nums[i] = numbers[i];
}
Arrays.sort(nums, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
String str1 = Integer.toString(o1);
String str2 = Integer.toString(o2);
int minIndex = Math.min(str1.length(), str2.length()), i;
for (i = 0; i < minIndex; i++) {
if (str1.charAt(i) != str2.charAt(i)) {
return str1.charAt(i) - str2.charAt(i);
}
}
if (i == str1.length() && i == str2.length()) {
return 1;
} else if (i == str1.length()) {
return compare(o1, Integer.parseInt(str2.substring(i)));
} else {
return compare(Integer.parseInt(str1.substring(i)), o2);
}
}
});
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nums.length; i++) {
sb.append(nums[i]);
}
return sb.toString();
}
public static void main(String[] args) {
// int[] numbers = {30, 32};
// int[] numbers = {3, 32, 321, 30, 311};
// int[] numbers = {30, 301, 30301};
int[] numbers = {1, 11, 111};
System.out.println(PrintMinNumber(numbers));
}
}看offer书,发现我写的递归,可以进行更简单的改写,nice!
import java.util.Arrays;
import java.util.Comparator;
public class Solution {
public static String PrintMinNumber(int[] numbers) {
String[] nums = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
nums[i] = Integer.toString(numbers[i]);
}
Arrays.sort(nums, new Comparator<String>() {
public int compare(String o1, String o2) {
String str1 = o1 + o2;
String str2 = o2 + o1;
return str1.compareTo(str2);
}
});
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nums.length; i++) {
sb.append(nums[i]);
}
return sb.toString();
}
public static void main(String[] args) {
// int[] numbers = {30, 32};
// int[] numbers = {3, 32, 321, 30, 311};
// int[] numbers = {30, 301, 30301};
int[] numbers = {1, 11, 111};
System.out.println(PrintMinNumber(numbers));
}
}
京公网安备 11010502036488号