2011-09-22 40 views
0

這是我的代碼來做到這一點。它適用於字符串表示,但不適用於ArrayList<ArrayList<Integer>>之一。Java中的整數分區

public static void partition(int n) { 
    partition(n, n, "", new ArrayList<ArrayList<Integer>>(), new ArrayList<Integer>()); 
} 
public static void partition(int n, int max, String temp, ArrayList<ArrayList<Integer>> master, ArrayList<Integer> holder) { 
    if (n == 0) { 
     ArrayList<Integer> temp1 = new ArrayList<Integer>(); 
     for(int i=0;i<=holder.size();i++) 
     { 
      temp1.add(holder.get(0)); 
      holder.remove(0); 
     } 
     master.add(temp1); 
     System.out.println(temp); 
    } 

    for (int i = Math.min(max, n); i >= 1; i--) { 
     holder.add(i); 
     partition(n-i, i, temp + " " + i,master,holder); 
    } 
} 

,我與temp1中做了不道德的事的原因是,如果我只是添加溫度掌握,由先前的元素會改變(主機的所有元素將指向同一個地方的引用),所以這是我對深層複製+清晰的嘗試。

該字符串的作品。爲什麼不是ArrayList<ArrayList<Integer>>?我該如何解決它? (ArrayList>的輸出是[[5],[4,1],[3,2],[1,1],[2,2],[1,1,1],[1 ,1,1,1]])

+1

沒有其他人發現問題嗎? – Bohemian

+1

你怎麼解決它?它應該做什麼?換句話說,你顯示的是輸出,但不是它看起來應該是什麼。你是什​​麼意思「它適用於一個字符串」? –

+0

好吧,我可以發現這個bug:'for(int i = 0; i <= holder.size(); i ++)':'holder.size()'當'i'增加時減少,所以你不會迭代所有持有人,但只有一半。 – amit

回答

2

您正在將您的holder數組混合在if分支中,您不應該這樣做。請嘗試以下操作:

public static void partition(int n, int max, String temp, ArrayList<ArrayList<Integer>> master, ArrayList<Integer> holder) { 
    if (n == 0) { 
     ArrayList<Integer> temp1 = new ArrayList<Integer>(); 
     for (int i = 0; i < holder.size(); i++) { 
      temp1.add(holder.get(i)); 
     } 
     master.add(temp1); 
     System.out.println(temp); 
    } 

    for (int i = Math.min(max, n); i >= 1; i--) { 
     holder.add(i); 
     partition(n - i, i, temp + " " + i, master, holder); 
     holder.remove(holder.size() - 1); 
    } 
} 
+2

我希望我在做作業的時候有過。 *嘆息* –

+1

@DaveNewton噢,但是你只問了一個問題 - 所以你不能期望太多的答案;-) – Howard

+0

我總是做我自己的功課;)嗯,當我做到了:/ –