最开始的思路:
把所有数,按照位数最长的数的位数来补齐(补上的数即是该数的首位)
例如:
最长位数为5,则9补齐后是“99999”, 32补齐后是“32333”
按照补齐后的数的大小来排序,做组合
以上解法是找规律得出的
解决的特殊情况:
“121”和”12”,补足后,都是121,此例中应选12+121
0, 0
8308, 830,此例中应选8308+830
问题是:上述思路,无法解决”121”和”12”、“8308”和“830”的问题,找不到一个什么规律来选择。
public class Solution {
/*
把所有数,按照位数最长的数的位数来补齐(补上的数即是该数的首位)
例如:
最长位数为5,则9补齐后是“99999”, 32补齐后是“32333”
按照补齐后的数的大小来排序,做组合
以上解法是找规律得出的
解决的特殊情况:
"121"和"12",补足后,都是121,此例中应选12+121
0, 0
8308, 830,此例中应选8308+830
*/
public String expand(String origin, int len){
StringBuilder sb = new StringBuilder();
sb.append(origin);
for (int i = 0; i < len - origin.length(); i ++){
sb.append(origin.charAt(0));
}
return sb.toString();
}
public class Number implements Comparable<Number>{
public String number;
public String num_expand;
public Number(int num, int len){
this.number = String.valueOf(num);
this.num_expand = expand(this.number, len);
}
@Override
public int compareTo(Number arg0){
int tmp = num_expand.compareTo(arg0.num_expand);
if (tmp == 0){
//特殊情况,如果两者相等,那就看this.number哪个短选哪个
//e.g. "121"和"12"补足后,都是121,此例中应选12+121
//还有更特殊的情况:8308, 830,此例中应选8308+830
if (number.length() < arg0.number.length()){
tmp = 1;
}
if (number.length() > arg0.number.length()) {
tmp = -1;
}
}
return tmp;
}
}
public String largestNumber(int[] nums) {
int max_num_len = 0;
for (int num : nums){
String tmp = String.valueOf(num);
if (tmp.length() > max_num_len)
max_num_len = tmp.length();
}
ArrayList<Number> numbers = new ArrayList<Number>();
for (int num : nums){
numbers.add(new Number(num, max_num_len));
}
Collections.sort(numbers);
Collections.reverse(numbers);
StringBuilder result = new StringBuilder();
for (Number num : numbers){
System.out.println(String.format("%s\t%s", num.number, num.num_expand));
result.append(num.number);
}
String res = result.toString();
if (res.charAt(0) == '0')
return "0";
else
return res;
}
public static void main(String[] args){
Solution solution = new Solution();
String s1 = "hot";
String s2 = "dog";
int n = 3;
int[] nums = {9051,5526,2264,5041,1630,5906,6787,8382,4662,4532,6804,4710,4542,2116,7219,8701,8308,957,8775,4822,396,8995,8597,2304,8902,830,8591,5828,9642,7100,3976,5565,5490,1613,5731,8052,8985,2623,6325,3723,5224,8274,4787,6310,3393,78,3288,7584,7440,5752,351,4555,7265,9959,3866,9854,2709,5817,7272,43,1014,7527,3946,4289,1272,5213,710,1603,2436,8823,5228,2581,771,3700,2109,5638,3402,3910,871,5441,6861,9556,1089,4088,2788,9632,6822,6145,5137,236,683,2869,9525,8161,8374,2439,6028,7813,6406,7519};
String s = solution.largestNumber(nums);
System.out.println(s);
}
}
正确解法:
比较a和b该怎么放,直接看 ab和ba哪个大就好了
/*
比较a和b该怎么放,直接看 ab和ba哪个大就好了
*/
public String largestNumber(int[] nums) {
String[] numbers = Arrays.stream(nums).mapToObj(String::valueOf).toArray(String[]::new);
Arrays.sort(numbers, (String s1, String s2) -> (s1.compareTo(s2)));
StringBuilder result = new StringBuilder();
for (int i = numbers.length - 1; i >= 0; i --){
result.append(numbers[i]);
}
String res = result.toString();
if (res.charAt(0) == '0')
return "0";
else
return res;
}