Недавно наткнулся на вызов хакерранка, чтобы найти пару int в заданном массиве. Использование ArrayList в качестве подхода. Может ли кто-нибудь исправить ошибки в этом коде.Поиск числа пар целых чисел в ArrayList
Ошибка: Исключение в потоке "основного" java.lang.IndexOutOfBoundsException: Индекс: 10, Размер: 9
на java.util.ArrayList.rangeCheck (ArrayList.java:653)
на Java .util.ArrayList.remove (ArrayList.java:492)
на Solution.main (Solution.java:32)
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int c[] = new int[n];
for(int c_i=0; c_i < n; c_i++){
c[c_i] = in.nextInt();
}
int count=0;
Arrays.sort(c);
ArrayList<Integer> ch = new ArrayList<>();
for(int c_i=0; c_i < n; c_i++){
ch.add(c[c_i]);
}
for(int i=0;i<ch.size();i++){
int a = ch.get(i);
int b=ch.indexOf(a);
if(b<0)
continue;
else{
ch.remove(a);
ch.remove(b);
count++;
for (int j=0;j<ch.size()-2;j++){
ch.add(j,ch.get(j+2));
}
}
System.out.println(count);
}
}
Под редакцией выше подход и в то время обнаружили, что b
даст индекс a
, удаляющий только один элемент всегда, поэтому теперь попытался подход, при котором первый элемент удаляется независимо от того, а затем ищет соответствующий элемент пары до тех пор, пока arrayList не будет пустым.
while(ch.size()!=0){
int a = ch.get(0);
ch.remove(0);
int b = ch.indexOf(a);
if(b<0){
for (int j=0;j<ch.size()-1;j++)
ch.add(j,ch.get(j+1));
continue;
}
else{
ch.remove(b);
count++;
for (int j=0;j<ch.size()-2;j++)
ch.add(j,ch.get(j+2));
}
}
Error: Terminated due to timeout
Если 'a = ch.get (i)', что останавливает 'b' равным' i'? –
Ошибка будет происходить в этой строке 'ch.remove (a);' так как в вашей программе 'a' может быть число, большее размера' Arraylist'. – BeginnersSake
Любые другие альтернативы, удаляющие элементы из массива, чтобы они не мешали поиску. Также я удаляю элементы, поэтому они не мешают другой рекурсивной паре. –