【问题标题】:All numbers resulting from adding elements of an array由添加数组元素产生的所有数字
【发布时间】:2017-12-03 22:44:43
【问题描述】:

我正在尝试编写一个程序,给定一个整数数组,返回添加向量元素所产生的所有值。

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

我需要使用蛮力对其进行迭代编程,我尝试使用几个嵌套的 for 循环来解决它,但我没有成功

【问题讨论】:

  • 如果您添加更多详细信息,例如在这种情况下什么是矢量元素以及如何获取它们,我可能会为您提供帮助?
  • 请注意 SO 不是代码编写服务。我们可以帮助您找到问题,或为您指明正确的方向,但我们需要您先尝试一些事情,然后将其与遇到的任何相关问题一起发布。
  • @roelofs 不好意思,这是我第一次使用 SO,下次我会记住的

标签: java arrays iteration combinations brute-force


【解决方案1】:

显然,由于输出大小将为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);;
    }
}

【讨论】:

    【解决方案2】:

    我会推荐一个递归解决方案

    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,从技术上讲,它不会将任何元素添加在一起

    【讨论】:

    • 我认为你应该创建一个全局prev list,如果它没有被多次创建。
    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2018-08-12
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多