Participei de um desafio onde dado um input de Inteiros N e queries Q, utilizando a Interface List devo ler os Inteiros N e popular um List, depois ler as queries Q que podem ser "Insert" ou "Delete" executar as queries e por fim imprimir a lista resultante.
Onde:
1<=N<=4000;
1<=Q<=4000 ;
Insert (index, value)
Delete (Index)
Ocorre que meu código falhou no seguinte cenário:
Insert
441 58
List.size = 47 então o insert no indice 441 (list.add(441, 58)
) lança IndexOutOfBoudException
Isso ocorreu em apenas 1 dos 10 test cases do desafio, ou seja em 9 de 10 o código funcionou.
Exemplo de input:
5
12 0 1 78 12
2
Insert
5 23
Delete
0
Output esperado:
0 1 78 12 23
Sei que as implementações de List aumentam seu size
dinamicamente.
Porem fiquei na dúvida se é um erro de implementação meu ou erro do test case.
Pergunta é possível adicionar um elemento utilizando um ArryList num índice maior que .size() ? Exemplo size=50 add no indice 400.
Resolução que escrevi com o input que gera o erro no link abaixo:
PS. O trecho comentado eu adicionei após os resultados para tentar descobrir o que estava acontecendo.
Aqui o input que gera o erro: https://hr-testcases-us-east-1.s3.amazonaws.com/16960/input06.txt?AWSAccessKeyId=AKIAR6O7GJNX5DNFO3PV&Expires=1651086923&Signature=xdLqekslDhe2aM3rFJekkUBwQF8%3D&response-content-type=text%2Fplain
public class Java_List {
static List<Integer> anArray = new ArrayList<>();
public static void main(String[] args) {
Scanner in = new Scanner(sample);
int membersSize = in.nextInt();
in.nextLine();
for (int i = 0; i < membersSize; i++) {
anArray.add(in.nextInt());
}
while (in.hasNext()) {
in.nextLine();
if (in.hasNext("Insert")) {
in.nextLine();
while (in.hasNextInt()) {
int index = in.nextInt();
int value = in.nextInt();
add(index, value);
}
} else if (in.hasNext("Delete")) {
in.nextLine();
delete(in.nextInt());
}
}
in.close();
print();
}
static void delete(int index) {
try {
anArray.remove(index);
} catch (IndexOutOfBoundsException e){
}
}
static void add(int index, int value) {
/* if(index > anArray.size()){
ArrayList<Integer> temp = new ArrayList<Integer>(index +1);
temp.addAll(anArray);
for (int i = anArray.size(); i< index; i++){
temp.add(i, null);
}
anArray.addAll(temp);
}*/
anArray.add(index, value);
}
static void print() {
anArray.forEach(value -> {
if(value != null) {
System.out.print(value + " ");
}
});
}
}