Arrays 重新排列整数数组的元素(正)以形成最大结果数

Arrays 重新排列整数数组的元素(正)以形成最大结果数,arrays,algorithm,Arrays,Algorithm,这是一个面试问题。我们有一个正整数数组,我们必须重新排列并连接数组元素,这样得到的数字就是使用这个数组可以形成的最大数字 e、 g: 我的解决方案是:我认为应该先按最高有效位(MSD)降序排列元素 i、 e对于909、12、88,我们将在排序后得到909、88、12,对于那些具有相同MSD的,将第二个MSD排序,并继续这样做 所以对于数组909,99,我们将有99和909,并将它们组合起来。 但对于数组909,90,我们将有90909,这是一个陷阱,因为我们在两个数字中都有90个共同点 九十 9

这是一个面试问题。我们有一个正整数数组,我们必须重新排列并连接数组元素,这样得到的数字就是使用这个数组可以形成的最大数字

e、 g:

我的解决方案是:我认为应该先按最高有效位(MSD)降序排列元素

i、 e对于909、12、88,我们将在排序后得到909、88、12,对于那些具有相同MSD的,将第二个MSD排序,并继续这样做

所以对于数组909,99,我们将有99和909,并将它们组合起来。 但对于数组909,90,我们将有90909,这是一个陷阱,因为我们在两个数字中都有90个共同点

九十

909->这里有两种可能的组合,因为90是公共的,所以在从909中删除公共部分后,9就剩下了,所以我将检查将9添加到90是否会使其更大。在这个例子中,在90前面加9,我们有990,大于909,所以909后面会加90。所以答案是90990

但当我试图编写代码时,我发现很难编写代码,因为它涉及太多的复杂性。有什么建议吗?

让数字集中的宽度=最小值(#位数)

仅按数字的第一个宽度数字对数字进行排序-通过先对数字进行较少的排序来打破关系

就拿第一个吧


在此处重复逻辑。把这两个数字连在一起比较一下。拿大一点的,按顺序分类。然后反向数组将产生更大的数。下面是java中的代码

公共类排列为MBigger编号 { /** *@param args */

publicstaticvoidmain(字符串[]args)
{
整数arr[]={10,9,20};
sort(arr,新的比较器()
{
@凌驾
公共整数比较(对象o1、对象o2)
{
返回-(o1+“”+o2)。与(o2+“”+o1)比较;
}
});
字符串res=“”;
for(整数i:arr)
{
res+=i;
}
系统输出打印项次(res);
}
}

这只是一个基数排序问题。需要按降序对数字进行排序。然后生成数字。

我们必须进行字典排序来解决这个问题。假设I1I2是我们必须比较的整数,然后取I1+I2I2+I1,如果I1+I2>I2+I1I1应该放在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));
}
导入java.util.array;
导入java.util.Comparator;
公共类LexicographicSort实现了Comparator{
公共整数比较(整数o1,整数o2){
字符串s1=o1.toString();
字符串s2=o2.toString();
返回(s2+s1)。与(s1+s2)比较;
}
公共静态void main(字符串[]args){
LexicographicSort ls=新的LexicographicSort();
整数[]nums={9,1,907,5};
Arrays.sort(nums,ls);
System.out.println(Arrays.toString(nums));
}

巧合的是,这个问题是在Python上下文中提出的,发布了几个可行的解决方案。我刚刚看到了这个问题。Stackoverflow在我搜索它时没有显示出来,但无论如何,我们可以在这里讨论使它更通用的算法。它不起作用。例如,88,884 width=2,所以按88排序后,我们有884和88。所以取884和then 88形成88488,这是错误的。好的-所以我说只按第一个“宽度”数字排序;你需要先选择最短的数字。不确定如何表达90909的简洁性我们有90909,这是错误的,应该是90990
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);
}
}
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));
}