Java 查找给定范围内n个数的倍数

Java 查找给定范围内n个数的倍数,java,algorithm,Java,Algorithm,我面临一个问题,我被赋予了一个范围: 考虑:start,end 和N个数字:n1、n2、n3….nn 我应该找到范围内所有N个数字的倍数(开始,结束) 我试过的- 我尝试创建一个HashSet,然后在范围start、end中逐个查找N个数字的倍数(在HashSet中插入每个倍数)。然后,在集合的末尾是答案。 这很有效。但不适用于大输入 考虑- Input: 1 10 3 6 3 7 Output: 4 解释- Range: 1 to 10 N: 3 Numbers: 6, 3, 7 Multi

我面临一个问题,我被赋予了一个范围: 考虑:
start,end

和N个数字:
n1、n2、n3….nn

我应该找到范围内所有N个数字的倍数(开始,结束)

我试过的-


我尝试创建一个HashSet,然后在范围start、end中逐个查找N个数字的倍数(在HashSet中插入每个倍数)。然后,在集合的末尾是答案。

这很有效。但不适用于大输入

考虑-

Input: 1 10 3 6 3 7
Output: 4
解释-

Range: 1 to 10
N: 3
Numbers: 6, 3, 7
Multiples of 3 = 3,6,9 (quantity =3)
Multiples of 6 =6 (quantity =1, but 6 is common)
Multiples of 7 = 7 (quantity=1)
Total quantity = 4

因此,输出为4。输出是4而不是5,因为6是3,6的倍数。(避免重复)。

这里是另一个包含一些测试数据的解决方案。完成此任务实际上不需要哈希集


导入java.util.*;
公共类多重计数{
公共静态void main(字符串[]args){
List testData=List.of(List.of(1,10,3,6,3,7),
名单(3296473489587438510939833674770795),
(1,10,2,2,2,2,2)项的清单;
用于(列表:testData){
系统输出打印项次(列表);
int m=getMultiples(列表);
系统输出打印项次(m);
}
}
公共静态整数getMultiples(列表数据){
列表结果=新建ArrayList();
for(int k:data.subList(2,data.size())){

对于(int i=data.get(0);i则在末尾用范围大小减去集合大小(end start+1)。为什么


你所做的散列集是你想要得到的实际数量。在上面的问题中,你的
散列集包含
3,6,9,7
。那么你为什么要从初始设置大小中减去这个设置大小。简单地得到
set.size()
。这是你的数量。

一个简单的答案是:

public static void main(String[] args)
{
    /* Initialization */
    int min = 1;
    int max = 1000;
    final Set<Integer> solutions = new HashSet<>();
    final Set<Integer> items = new HashSet<>();
    Collections.addAll(items, 3,6,7);


    /* Solution */
    items.forEach(element -> solutions.addAll(findMultiples(element, min, max)));

    System.out.println("Total quantity: " + solutions.size());
    solutions.forEach(System.out::println);
}

private static Collection<Integer> findMultiples(int element, int min, int max) {
    if (min % element != 0) {
        min = element * (min / element + 1);
    }
    final Collection<Integer> solutions = new ArrayList<>();
    for (int i = min; i < max; i+=element) {
        solutions.add(i);
    }

    return solutions;
}
publicstaticvoidmain(字符串[]args)
{
/*初始化*/
int min=1;
int max=1000;
最终集解决方案=新HashSet();
最终设置项=新HashSet();
集合。添加所有(项目3、6、7);
/*解决方案*/
items.forEach(element->solutions.addAll(findMultiples(element,min,max));
System.out.println(“总量:+solutions.size());
solutions.forEach(System.out::println);
}
私有静态集合findMultiples(int元素、int最小值、int最大值){
如果(最小%element!=0){
最小值=元素*(最小值/元素+1);
}
最终收集解决方案=新的ArrayList();
对于(int i=min;i

对于每个元素,您查找第一个整数,它是它的倍数,并且在给定的范围内。然后,您使用
元素
的步骤进行迭代。使用
哈希集
,很容易找到结果。

据我所知,您有一个数字列表和一个范围。 您想知道该范围内有多少个数字是列表中某个数字的倍数

要解决这个问题,您需要定义整除性
isDivisible
和多重性
isMultiple
。 请注意,我将
isMultiple
定义为
number
是否是列表
units
中一个数字的倍数,而不仅仅是另一个数字

最后,您要检查您的范围中哪些数字符合条件

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Solver {
    public static void main(final String[] args) {
        final Solver solver = new Solver();
        final List<Integer> input = Arrays.asList(3, 6, 3, 7);
        final int result = solver.numberOfMultiples(1, 10, input);
        System.out.println("Result: " + result);
    }

    public int numberOfMultiples(final int start, final int end, final List<Integer> numbers) {
        final List<Integer> multiples = new ArrayList<>();
        for (int i = start; i < end; i++) {
            if (isMultiple(i, numbers)) {
                multiples.add(i);
            }
        }
        return multiples.size();
    }

    private boolean isMultiple(final int number, final List<Integer> units) {
        for (final int unit : units) {
            if (isDivisible(number, unit)) {
                return true;
            }
        }
        return false;
    }

    private boolean isDivisible(final int number, final int unit) {
        return number % unit == 0;
    }
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公共类求解器{
公共静态void main(最终字符串[]args){
最终解算器=新解算器();
最终列表输入=Arrays.asList(3,6,3,7);
最终整数结果=解算器。numberOfMultiples(1,10,输入);
System.out.println(“结果:+Result”);
}
公共整数倍数(最终整数开始、最终整数结束、最终列表编号){
最终列表倍数=新的ArrayList();
for(int i=start;i
您可以使用以下功能快速找到倍数:

public static int multiples(int lower, int upper, int divider) {
    int number = ((int) (upper / divider)) - ((int) (lower / divider));
    return number;
}

“我试过创建一个HashSet,然后…”show,不要说对不起,我实际上告诉了你关于问题其余部分的解决方案。我已经编辑掉了。是的set.size()是答案。int min=32964;int max=73489;final set solutions=new HashSet();final set items=new HashSet();Collections.addAll(项目587、438、510、939、833、674、770、795)不适用于此。@NaMo>问题出在哪里?您知道结果吗?如果知道,我很乐意检查我的结果。结果应该是484,而不是494。@NaMo>您确定吗?当我运行测试时,我找不到任何问题。它们是:
System.out.println(solutions.stream().filter)(solution->items.stream().noneMatch(question->solution%question==0)).collect(collector.toList());
System.out.println(solutions.stream().filter(solution->solution>max | | solution
。第一个查找不是多个项目的解决方案。第二个查找不包括在范围内的解决方案。