【问题标题】:How to create a list corresponding to each number from 2 to 100 that will contain numbers from an array that are its multiples?如何创建一个对应于从 2 到 100 的每个数字的列表,该列表将包含数组中作为其倍数的数字?
【发布时间】:2019-05-28 06:25:34
【问题描述】:

最近我遇到了这个问题,无法找到最佳解决方案。

假设我们有一个任意范围的数字数组,例如 9,-3,0,4,11,2,-8,..... 我们需要打印从 2 到 100 的数字,并且对应于它们中的每一个,我们需要从数组中打印一个数字列表,以便数组中的数字可以被它整除。 例子: 使用示例中的现有数组, 2 -> 4,2,-8,... 3 -> -3,9,... 4 -> 4,-8,... 像这样最多 100 个。

我尝试通过将数组的每个数字除以 2 到 100 的数字来计算解决方案,然后创建与每个数字对应的列表。但这在我看来并不是最佳解决方案。

我什至尝试对数字进行分组,例如可以被 8 整除的数字将被 2 和 4 整除,因此我们不需要再次将其除。这将减少一些操作和复杂性,但反过来又需要创建这样的组。

请任何人通过减少将每个数字除以 2 到 100 的需要来帮助找到该问题的最佳解决方案。

【问题讨论】:

  • 您能否通过提供minimal reproducible example 来展示您的作品?另外...查看更多规则或示例会很有帮助。
  • 如果列表中有两个相等的数字,我们需要做什么? 1) 显示一次 2) 在列表中显示多少次?在我看来,最佳解决方案就像使用素数分解。
  • 问题也是关于组中项目的顺序。按照原列表中的顺序显示就够了吗?
  • @SergeyProsin 我们可以假设数组已经包含不同的元素。请你解释一下如何推进素数分解?顺序也不重要。我们只需要生成列表。
  • @Sometowngeek 我现在没有任何代码。但我可以举一些例子。示例 array[] = {3,5,1,-7,6,34,88,2,-8,9,10,4,33} 那么输出应该是:2 -> 6,34,88,2,-8,10,4 3->3,6,9,33 4->88,-8,4 5->5,10 并且类似地直到 100。

标签: java logic


【解决方案1】:

为了解决给定的问题,我会选择以下两种方法之一:

版本 1

两个简单的嵌套循环结合方法map.computeIfAbsent

int[] myArray = {3,5,1,-7,6,34,88,2,-8,9,10,4,33};
Map<Integer,List<Integer>> version1 = new HashMap<>();
for(int i = 2; i< 100; i++){
    for(int x : myArray){
        if(x%i==0)
           version1.computeIfAbsent(i, k -> new ArrayList<>()).add(x);
    }            
}
System.out.println(version1);

第 2 版

只有流操作的解决方案

    Map<Integer,List<Integer>> version2 = Arrays.stream(myArray).distinct().boxed()
            .flatMap(p -> IntStream.range(2, 100).filter(i -> p%i ==0).boxed()
                    .map(l->new AbstractMap.SimpleEntry<>(l,p)))
            .collect(Collectors.groupingBy(Map.Entry::getKey,
                    Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

    System.out.println(version2);

当然有更优雅的解决方案或在复杂性方面最佳的解决方案。但我认为这里的方法简短易读。

【讨论】:

  • 感谢您的解决方案。
【解决方案2】:

如果你保留每个子列表,你可以使用以前的结果来限制列表的长度:

    List<List<Integer>> lists = new ArrayList<>();
    lists.add(list); // at 0: never used
    lists.add(list);
    for (int i = 2; i <= 100; ++i) {
        for (int j = i/2; j > 0; --j) {
            if (i%j == 0) {
                lists.add(extractMultiples(lists.get(j), i));
                break;
            }
        }
    }
    for (int i = 2; i <= 100; ++i) {
        System.out.println(i + ": " + lists.get(i));
    }

使用方法extractMultiples:

public static List<Integer> extractMultiples(List<Integer> list, int n) {
    List<Integer> result = new ArrayList<>();
    for (int x: list) {
        if (x%n == 0) {
            result.add(x);
        }
    }
    return result;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 2022-11-18
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多