#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 Дело не столько в репутации. Если у вас есть действительно хороший ответ на вопрос, вы должны предоставить его тому, кто задает вопрос, в ясной и выразительной форме. У вас действительно есть действительно хороший ответ, вы должны это сделать. Очевидно, что кто — то сделает это, если вы этого не сделаете.