2011-09-22 61 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

我总是做我自己的功课;)嗯,当我做到了:/ –