当前位置: 首页 > 知识库问答 >
问题:

写一个函数,给出一个非负整数的列表,排列它们,使它们形成尽可能大的数字

孟安民
2023-03-14

我有以下规格:

写一个函数,给出一个非负整数列表,将它们排列成可能的最大数。例如,给定[50,2,1,9],最大形成数为95021。

我曾尝试过解决这个问题,但失败了。例如,给定输入[90,91,89,999],此代码的结果是[909199989],但它应该是[999919089]。

简单地说,它是基数排序的倒数。

步骤
1)根据值创建桶。
2)每个桶都有元素列表。
3)对每个桶中的列表进行排序。
4)以相反的顺序显示结果。

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Scanner;

public class ReverseMaxPossibleNumber {
    public static void main(String[] args) {
        int[] a = { 50, 2, 1, 9 };
        int len = a.length;
        String ch = "";
        List<Map<String, ArrayList<String>>> list_map = new ArrayList<Map<String, ArrayList<String>>>();
        Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
        for (int i = 0; i < len; i++) {
            ch = "" + a[i];
            String str = "";
            ArrayList<String> arraylist = new ArrayList<String>();
            for (int j = 0; j < len; j++) {
                str = "" + a[j];
                if (ch.charAt(0) == str.charAt(0)) {
                    arraylist.add(str);
                    Collections.sort(arraylist);
                    map.put("" + ch.charAt(0), arraylist);
                }
            }
        }
        list_map.add(map);
        String str = "";
        for (String key : map.keySet()) {
            str = map.get(key) + str;

        }
        str = str.replaceAll("\\D+", "");
        System.out.println(str);
    }
}

共有3个答案

袁鸿达
2023-03-14

无论你如何组合这些数字,它们都会产生一个相同位数的数字。这意味着您要对它们进行排序,将最大的数字放在第一位。事实上,这是对字符串中的数字进行排序的相反问题,因为您希望像对字符串一样对数字进行排序(从第一个数字开始)

int[] a = {90, 91, 89, 999};
long num = Long.parseLong(
        IntStream.of(a)
                .mapToObj(Integer::toString)
                // reverse sort them as Strings.
                .sorted((x, y) -> (y + x).compareTo(x + y))
                .collect(Collectors.joining()));
System.out.println(num);

印刷品

999919089
闾丘成礼
2023-03-14

这里是JS上的实现

https://jsfiddle.net/b6r81jv9/

let input = [
  {test: [1, 2, 3, 4, 5, 6, 7, 8], res: "87654321"},
  {test: [50, 2, 1, 9], res: "95021"},
  {test: [1, 19], res: "191"},
  {test: [9, 90], res: "990"},
  {test: [9, 90, 900], res: "990900"},
  {test: [9, 909, 9909, 999], res: "99999909909"}
];
function big_number_simplified(arr) {
    return [...arr].sort((a, b) => b.toString() + a > a.toString() + b ? 1 : -1);
}
input.forEach(item => {
  let res_1 = big_number_simplified(item.test).join('');
  if (res_1 === item.res) {
        console.log(`[${item.test.join(',')}]: "${res_1}"`);
  } else {
    console.error(`ERROR: [${item.test.join(',')}]: "${res_1}", expected: "${item.res}"`);
  }
});
孟楷
2023-03-14

基本上,数字需要以某种方式排序,以形成最大可能的数字。考虑这个逻辑

  • 取任意两个数字ab

您可以在自定义比较器中实现它,并将其传递给集合。排序,如下所示:

public String maxNumber(int[] numbers) {
    // convert int[] -> List<String>
    List<String> list = new ArrayList<>(numbers.length);
    for (int num : numbers) {
        list.add(String.valueOf(num));
    }

    // sort using custom comparator
    Collections.sort(list, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));

    // join sorted items, forming max possible number
    return String.join("", list);
}

这里是基本相同的代码使用Java8:(感谢@marcospereira!)

public String maxNumber(Integer ... numbers) {
    return Stream.of(numbers)
            .filter(n -> n >= 0)
            .map(Object::toString)
            .sorted((s1, s2) -> (s2 + s1).compareTo(s1 + s2))
            .collect(Collectors.joining());
}
 类似资料:
  • 例如,它将以1开始,然后将2添加到列表中,得到1-2。然后将检查1-2以查看序列是否符合递增/递减的规则。当它符合时,将3相加,得到1-2-3。然后检查1-2-3,这不符合。所以我们会回到1,现在加3而不是2,给出1-3等等。 我在用C。

  • 我正在寻找一个函数,使列表尽可能未排序。最好是Python。 背景故事: 我想检查URL的状态,看看URL是否给出404。我只是使用和模块。没什么花哨的。 现在我不想让服务器过载,所以我想尽量减少同时检查同一域名上的网址。我有这样的想法来排序的URL的方式是项目是彼此接近(具有相同的排序键=域名)被放置尽可能远的彼此在列表中。 以数字为例: 可以不分类为: 我想说的是,我们可以通过将相等项(具有相

  • 我学Java已经有几个星期了,所以我不是很有经验。我遇到了一个错误,什么都没有打印,不知道为什么。这是我的密码 我输入数字后,什么也没打印出来。。

  • 我试图找到Python中提供的一个数的所有可能的因式分解。 例如:1)给定n=12,输出为,f(n)=[[2,2,3],[4,3],[6,2],[12]] 2)给定n=24,输出为,f(n)=[2,2,2,3],[2,2,6],[2,12],[4,6],[8,3],[24]] 2)1)对于n=24,输出为, 我可以做什么来获得相关的结果?

  • 给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。 例子: 给定nums=,target=6, 因为=24=6 。 解决方案 上面的代码在其他情况下有效,但在本例中无效。 预期结果 输出 例如,我尝试使用不同的数字数组和不同的目标,即使你改变数字的顺序,它也能工作 例子: 新数组:,目标=9, 输出:。 我不明白这个解决方案出了什么问题,我希望有人能解释一下。谢谢

  • 我在从两个表中检索数据然后列出它们时遇到了一些问题。我想将用户的提要帖子和他们喜欢的活动全部列在一个列表中。 提要-用户帖子表 我想做的是:在活动墙中列出提要和类似用户的活动。 所以它应该输出如下(按时间戳desc排序): “这是用户A的帖子” 我的当前SQL: 然而,我的问题是我不知道如何链接这两个表,因为我的“feed”中的ID与“likes”中的ID不同