微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

给定一个数字数组,在数字之间的任何位置使用 +-/* 查找可以从中生成的所有数字

如何解决给定一个数字数组,在数字之间的任何位置使用 +-/* 查找可以从中生成的所有数字

大家好,我正在努力解决这个问题

给定数组 [1,2,3]

输出应该是 [6,1,9,-4,-0.33333,-3,3.5,-2.5,0.1666666666,1.5,-1,0.66666666666]

前 -

1 + 2 + 3 = 6

1 + 2 -3 = 0 .... 等等。我们如何以最佳方式编写算法。

我已经尝试了以下代码 -

 public static Set<integer> getAllnums(List<Integer> nums){
        Set<integer> sums = new Set<integer>();
        Set<integer> partialsums ;
        sums.add(0);
        for(integer i = 0; i< nums.size() -1; i++) {
            partialsums = new Set<integer>();
            for(integer s: sums) {
                partialsums.add(s + nums[i]);
                partialsums.add(s - nums[i]);
                partialsums.add(s * nums[i]);
                partialsums.add(s / nums[i]);
                sums = partialsums;
            }
        }
        system.debug('sums: ' + sums);
        return sums;
    }

解决方法

操作数组的简单嵌套循环应该可以完成这项工作:

  • 在外循环中选择了第一对参数之间的操作:
  • 在内循环中,另一个操作应用于第一个操作的结果和剩余的参数。

结果可能存储在 LinkedHashSet<Double> 中以消除重复结果。

int[] nums = {1,2,3};

DoubleBinaryOperator[] ops = {
    (a,b) -> a + b,(a,b) -> a - b,b) -> a / b,b) -> a * b
};

Set<Double> res = new LinkedHashSet<>();
for (int i = 0; i < ops.length; i++) {
    double op1 = ops[i].applyAsDouble(nums[0],nums[1]);
    for (int j = 0; j < ops.length; j++) {
        res.add(ops[j].applyAsDouble(op1,nums[2]));
    }
}
System.out.println(res);

输出:

[6.0,0.0,1.0,9.0,2.0,-4.0,-0.3333333333333333,-3.0,3.5,-2.5,0.16666666666666666,1.5,5.0,-1.0,0.6666666666666666]

注意:实际上产生了 15 个结果,而不是问题中提到的 14 个。
唯一重复的结果是 6 == 1+2+3 == 1*2*3

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。