这是一个面试问题。我们有一个正整数数组,我们必须重新排列和连接数组元素,以便得到的数字是使用这个数组可以形成的最大数。
e.g:
[884 88] -> 88884
[20 19 90] -> 902019
[909 90] -> 90990
我的解决方案:我认为首先按重要数字(MSD)按顺序对元素进行排序。
即909,12,88我们将在排序后得到909,88,12,对于那些具有相同MSD的人排序第二MSD并继续这样做。
因此对于数组909,99,我们将得到99和909并将它们组合起来。 但是对于阵列909,90我们将有90,909,这是一个问题,因为我们有两个数字共有90个
90
909 --->这里有两种可能的组合,因为90是常见的,所以在从909删除公共部分后剩下9,所以我将检查是否附加这个9到90使它变大。在这种情况下,在90之前附加9我们有990大于909所以909将跟随90.所以答案是90990。
但是当我尝试编码时,由于涉及太多的复杂性,我发现编码很困难。有什么建议吗?
答案 0 :(得分:0)
让数字集合中的width = min(#digits)
将数字排序仅按其第一个宽度数字排序 - 通过排序数字较少的数字来打破关系
拿第一个
重复
答案 1 :(得分:0)
这里的逻辑应该是。将两个数字相关联并进行比较。拿出较大的一个并按照顺序排序。然后反转的数组将产生更大的数字。以下是java中的代码。
公共类ArrangeToFormBiggerNumber { / ** * @param args * /
public static void main(String[] args)
{
Integer arr[] = {10,9,20};
Arrays.sort(arr, new Comparator<Object>()
{
@Override
public int compare(Object o1, Object o2)
{
return -(o1 + "" + o2).compareTo(o2 + "" + o1);
}
});
String res = "";
for (Integer i : arr)
{
res += i;
}
System.out.println(res);
}
}
答案 2 :(得分:0)
这只是一个基数排序问题。需要按递减顺序对数字进行排序。然后生成数字。
答案 3 :(得分:0)
我们必须做一个Lexicographic Sort来解决这个问题。假设 I1 和 I2 是我们必须比较的整数,然后取 I1 + I2 和 I2 + I1 如果 I1 + I2&gt; I2 + I1 , I1 应放在 I2 之前,否则反之亦然。以下是此问题的Java实现。
import java.util.Arrays;
import java.util.Comparator;
public class LexicographicSort implements Comparator<Integer> {
public int compare(Integer o1, Integer o2) {
String s1 = o1.toString();
String s2 = o2.toString();
return (s2+s1).compareTo(s1+s2);
}
public static void main(String[] args) {
LexicographicSort ls = new LexicographicSort();
Integer[] nums = {9,1,90,907,5};
Arrays.sort(nums, ls);
System.out.println(Arrays.toString(nums));
}