0

可能な個別の合計はすべて、配列内の任意の 1、2、3 から n (配列の長さ) までの合計を意味します。たとえば、指定された配列が [2,2,3] の場合、配列内の 1 つの数値の合計は配列自体 [2,2,3] であり、配列内の任意の 2 つの数値の合計は [4,5] です。配列内の 3 つの数値の合計は [7] したがって、結果はすべての可能な合計の組み合わせである [2,3,4,5,7] である必要があります。アルゴリズムの考えだけで、特定のコードは必要ありません。 . ありがとうございました

4

4 に答える 4

0

最も簡単な方法は、単純に反復して合計を取得し、それらを重複を許可しないコレクションに追加することです。

于 2012-04-24T23:08:27.197 に答える
0

要求されたコード:

//following taken from http://rosettacode.org/wiki/Power_set#Java
public static <T extends Comparable<? super T>> LinkedList<LinkedList<T>> BinPowSet(
        LinkedList<T> A){
    LinkedList<LinkedList<T>> ans= new LinkedList<LinkedList<T>>();
    int ansSize = (int)Math.pow(2, A.size());
    for(Integer i= 0;i< ansSize;++i){
        String bin= Integer.toString(i, 2); //convert to binary
        while(bin.length() < A.size())bin = "0" + bin; //pad with 0's
        LinkedList<T> thisComb = new LinkedList<T>(); //place to put one combination
        for(int j= 0;j< A.size();++j){
            if(bin.charAt(j) == '1')thisComb.add(A.get(j));
        }
        Collections.sort(thisComb); //sort it for easy checking
        ans.add(thisComb); //put this set in the answer list
    }
    return ans;
}
//use would be
Set<Integer> sums = new HashSet<Integer>();
LinkedList<Integer> powerList = new LinkedList<Integer>(Arrays.<Integer>asList(arr));
for(Collection<Integer> sumEntry : BinPowSet(powerList)) {
    int x = 0;
    for(Integer y : sumEntry) {
        x += y;
    }
    sums.add(x);
}
return sums;

重複は削除できることに注意してください。足し算は共有的であるため、単一の要素を 2 回追加しないセットの要素の合計は、任意の順序で取られ、上記に存在します。

また、Guava の Sets.powerSet() が考慮されましたが、入力として実際の Set が必要であり、重複が許可されないことに注意してください (例に存在していました)。

于 2012-04-24T23:35:48.200 に答える
0

私は次のように質問に取り組みます。まず、組み合わせを計算する関数を作成します。

組み合わせ(オブジェクト[] A、int r)

この関数は、A からすべての nCr の組み合わせを返します。ここで、n = A.length この関数を配置したら、r=1、2、3... に対して呼び出して、合計を出力できます。

コンビネーション ルーチンを書くことは、かなり標準的な技術面接の質問です。

于 2012-04-25T02:24:38.073 に答える