问题描述
大家好,我正在努力解决这个问题
给定数组 [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