Существует хорошо известная алгоритмическая проблема с заданным массивом чисел, например. [1, 20, 3, 14]
расположите числа таким образом, чтобы они образовывали наибольшее возможное число, в данном случае 320141
.
На SO и других сайтах есть множество решений, использующих следующий алгоритм:
String[] strs = new String[nums.length];
for(int i=0; i<nums.length; i++){
strs[i] = String.valueOf(nums[i]);
}
Arrays.sort(strs, new Comparator<String>(){
public int compare(String s1, String s2){
String leftRight = s1+s2;
String rightLeft = s2+s1;
return -leftRight.compareTo(rightLeft);
}
});
StringBuilder sb = new StringBuilder();
for(String s: strs){
sb.append(s);
}
return sb.toString();
Это, безусловно, работает, но я не могу найти формальное доказательство этого алгоритма. На quora есть один ответ, но я бы не назвал его формальным доказательством.
Кто-нибудь может дать мне набросок доказательства или ссылку на какую-нибудь книгу или статью? Как можно получить это решение от исходной задачи?
PS Я пытался решить первоначальную задачу, но мое решение было неправильным, я не мог понять его правильно, и теперь я не мог полностью понять решение.