添加数组元素产生的所有数字

时间:2017-12-03 22:44:43

标签: java arrays iteration combinations brute-force

我试图创建一个程序,给定一个整数数组,返回由添加向量元素产生的所有值。

例如:对于数组A = {2,1,3},输出应为{2,3,5,1,3,4,3,5,4,6}

我需要使用暴力来迭代编程,我试图使用几个嵌套的for循环来解决它,但我还没有成功

2 个答案:

答案 0 :(得分:0)

我建议使用递归解决方案

List<Integer> combos(int[] input)
{
    return combos(input, 0);
}

List<Integer> combos(int[] input, int offset)
{
    if(offset >= input.length) //base case, return 0 for no elements added
    {
        List<Integer> out = new ArrayList<Integer>((int)Math.pow(2, input.length));
        out.add(0);
        return out;
    }

    List<Integer> prev = combos(input, offset + 1);
    prev.addAll(prev); //double the previous result

    //add input[offset] to half the elements
    for(int i = 0; i < prev.size() / 2; i++)
        prev.set(i, prev.get(i) + input[offset]);

    return prev;
}

输入{1, 2, 4}输出{7, 3, 5, 1, 6, 2, 4, 0}

请注意,这包括0,这在技术上不会将所有元素添加到一起

答案 1 :(得分:0)

显然,由于输出大小为2^n,其中n是输入向量中的元素数,很快就会耗尽内存。

那就是说,你正在寻找向量中所有元素组合的总和。所以你要做的就是找到所有的组合。一种简单的方法是从0 to 2^n迭代,并在每次迭代中仅选择迭代计数器中的位打开的向量中的索引。

这是一种蛮力方法

package com.test;

import java.util.Arrays;

public class TestCombo {
    public static void main(String[] args) {
        int[] arr = {2, 1, 3};

        int resultCount = (int)Math.pow(2, arr.length);
        int[] result = new int[resultCount - 1];

        for(int i = 1; i < result.length + 1; i++) {
            int j = i;

            int sum = 0;

            for(int arrI = 0; j != 0; arrI++) {
                if( (j & 1) == 1) { //Is arrI bit turned on?
                    sum += arr[arrI];
                }

                j = j >> 1;
            }

            result[i-1] = sum;
        }

        Arrays.stream(result).forEach(System.out::println);;
    }
}