2017-02-17 10 views
-1

Недавно наткнулся на вызов хакерранка, чтобы найти пару 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 
+1

Если 'a = ch.get (i)', что останавливает 'b' равным' i'? –

+0

Ошибка будет происходить в этой строке 'ch.remove (a);' так как в вашей программе 'a' может быть число, большее размера' Arraylist'. – BeginnersSake

+0

Любые другие альтернативы, удаляющие элементы из массива, чтобы они не мешали поиску. Также я удаляю элементы, поэтому они не мешают другой рекурсивной паре. –

ответ

1
int a = ch.get(i); 

Это позволит получить значение в месте я

ch.remove(a); 

Это удалит значение, хранящееся в индексе a. Значение a может быть возможно больше размера ArrayList.

Здесь вы ошибаетесь. Попробуйте прокомментировать это, возможно, это сработает

+0

Я использую подход, который, если у нас есть пара элементов, мы удаляем пару, чтобы снова начать процесс поиска и удаления. Таким образом, исключается возможность нахождения рекурсивных пар. –

Смежные вопросы