Программа «Прыгающие гусеницы» — застряла с ней (JAVA ) geeksforgeeks.com

#java #arrays #algorithm #math #data-structures

Вопрос:

Я застрял здесь, решая эту тренировочную программу для прыгающих гусениц
https://practice.geeksforgeeks.org/problems/jumping-caterpillars/0

Мое решение проходит несколько тестов, но не проходит один (может быть, больше), и я не могу понять, почему. Пожалуйста, помогите мне.

Программный вопрос таков: Задано N листьев, пронумерованных от 1 до N . Гусеница на листе 1 прыгает с листа на лист кратно Aj (Aj, 2Aj, 3Aj). j специфичен для гусеницы. Всякий раз, когда гусеница достигает листа, она немного его съедает.. Вы должны выяснить, сколько листьев, от 1 до N, осталось несъеденными после того, как все K гусениц достигли конца. Каждая гусеница имеет свой собственный коэффициент прыжка, обозначаемый Aj, и каждая гусеница начинается с листа под номером 1.

Ввод: Первая строка состоит из целого числа T, обозначающего количество тестовых наборов. Далее следует T тестовых случаев. Каждый тестовый случай состоит из двух строк ввода. Первая строка состоит из двух целых чисел: N, которое обозначает количество листьев; и K, которое обозначает количество гусениц. Вторая строка каждого теста состоит из K целых чисел, разделенных пробелом, обозначающих коэффициент прыжка гусениц.

Вывод: Для каждого тестового набора в новой строке выведите одно целое число, обозначающее количество несъеденных листьев.

Пример: Ввод:

1

10 3

2 3 5

Выход:

2

Мое решение на JAVA

 import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.stream.IntStream;
import java.util.stream.Collectors;

class GFG {
    public static void main (String[] args) {
        Scanner s = new Scanner(System.in);
        int nTestcases = s.nextInt();
        int nLeaves = s.nextInt();
        int nCaterpillars = s.nextInt();
        int[] catpillars = new int[nCaterpillars];
        IntStream.range(0,nCaterpillars).forEach(
            i -> catpillars[i] = s.nextInt());
        
        System.out.println(unVisited(nLeaves, catpillars));
        
    }
    
    static int unVisited(int nLeaves, int[] caterpillars){
        if(nLeaves <= 0) 
            return 0;
        if(caterpillars.length == 0 || caterpillars == null) 
            return nLeaves;
        List<Integer> leaves = new ArrayList<>();
        leaves = IntStream.rangeClosed(1,nLeaves)
            .boxed().collect(Collectors.toList());
        
        for(int caterpillar : caterpillars){
            leaves = visitLeaves(caterpillar, leaves);
        }
        return leaves.size();
    }
    
    static List<Integer> visitLeaves(int caterpillar, List<Integer> leaves){
        for(int i=0; i< leaves.size(); i  ){
            if(leaves.get(i) % caterpillar == 0){
                leaves.remove(i);        
            }
        }
        return leaves;
    }
}
 

Комментарии:

1. изменение во List время цикла может быть проблемой (если не корректировать индекс). Пример, если гусеницы указаны в порядке убывания ( 3 , 2 ). После первого прохода вы получите 1 2 4 5 ... , если сейчас 2 нужно перейти, когда i = 1 код будет удален 2 , а список будет 1 4 5 ; теперь i увеличивается до 2 следующей позиции. Но теперь позиция [1] , то есть значение 4 в списке, не проверяется

2. Предложения: петля задом наперед, от конца списка; или, когда значение удаляется, уменьшается i , так что на следующей итерации (после того, как увеличивается) такая же позиция проверяется снова; или изменить модель данных, использовать boolean[] чтобы отметить посетили листьев, а петли за шагом, чтобы пометить его…выше код также не будет работать, если одна гусеница прыгает 1 (или меньше?)

3. также нет необходимости возвращать/повторно назначать список, изменяется только его содержимое, а не список (экземпляр)

4. @user15244370 Вы должны предоставить подробное объяснение на Your Answer панели.

5. @user15244370 Дело не столько в репутации. Если у вас есть действительно хороший ответ на вопрос, вы должны предоставить его тому, кто задает вопрос, в ясной и выразительной форме. У вас действительно есть действительно хороший ответ, вы должны это сделать. Очевидно, что кто — то сделает это, если вы этого не сделаете.