【问题标题】:Rearrange the elements of an array of integers(positive) to form a maximum resulting number重新排列整数数组(正数)的元素以形成最大结果数
【发布时间】:2013-01-14 15:57:39
【问题描述】:

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

例如:

[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。

但是当我尝试对其进行编码时,我发现由于涉及的复杂性太高而难以编码。有什么建议吗?

【问题讨论】:

  • 巧合的是,这个问题是在 Python 上下文 very recently 中提出的,并发布了几个可行的解决方案。
  • 我刚看到这个问题。我搜索时 Stackoverflow 没有显示它,但无论如何我们可以在这里讨论算法,使其更通用。

标签: arrays algorithm


【解决方案1】:

我们必须进行字典排序来解决这个问题。假设 I1 和 I2 是我们必须比较的整数,然后取 I1+I2 和 I2+I1如果 I1+I2 > 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));
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这里的逻辑应该是。连接两个数字并进行比较。取较大的一个并按照逆序对其进行排序。然后反转的数组将产生更大的数字。以下是java中的代码。

      公共类 ArrangeToFormBiggerNumber { /** * @param 参数 */

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

      【讨论】:

        【解决方案4】:

        让数字集合中的宽度 = min(#digits)

        仅对按第一个宽度数字递减的数字进行排序 - 通过首先对具有较少数字的数字进行排序来打破平局

        拿第一个

        重复

        【讨论】:

        • 这行不通。例如88, 884 width=2 所以按 88 排序后我们有 884 和 88。所以取 884 然后 88 形成 88488 这是错误的。
        • OK - 所以我说只按第一个“宽度”数字排序;你需要先选择最短的。不知道如何简洁地表达出来
        • ok for 90, 909 我们有 90909 这是错误的应该是 90990
        猜你喜欢
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        • 2012-08-17
        相关资源
        最近更新 更多