2017-02-17 75 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始終只刪除一個元素,所以現在嘗試了第一個元素被刪除的方法,無論如何,然後搜索匹配的pair元素,直到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); 

這將在位置檢索i的值

ch.remove(a); 

這將刪除存儲在索引a值。值a可能會大於ArrayList大小。

這是你出錯的地方。嘗試評論說,也許它會工作

+0

我使用的方法是,如果我們有一對元素,我們刪除這對來重新開始查找和刪除過程。這樣,找到遞歸對的可能性就被消除了。 –