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

时间:2013-01-30 18:04:41

标签: arrays algorithm

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

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。

但是当我尝试编码时,由于涉及太多的复杂性,我发现编码很困难。有什么建议吗?

4 个答案:

答案 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));
}