笔记:Java程序解析——计算满足条件的组合数量
import java.util.*; public class Main { public static int solution(int[] staples, int[] drinks, int x) { List lis = new ArrayList<>(); Integer sum = 0; for(int i : staples) { if(i <= x) sum++; } for(int i : drinks){ if(i <= x) sum++; } for(int i : staples) { for(int j : drinks){ if(i + j <= x) { sum ++; } } } return sum; // Placeholder }
public static void main(String[] args) {
System.out.println(solution(new int[]{5, 20, 5}, new int[]{5, 5, 2}, 5) == 5);
System.out.println(solution(new int[]{3, 10, 7}, new int[]{2, 5}, 7) == 5);
System.out.println(solution(new int[]{10, 15}, new int[]{5, 6}, 20) == 7);
}
}
程序功能
该程序定义了一个名为Main的类,其中包含一个名为solution的静态方法。该方法旨在计算给定两组整数(分别代表“staples”和“drinks”)中,单独或组合起来不超过给定值x的元素数量。
方法参数
staples:一个整数数组,表示一种物品(如小吃)的价格列表。drinks:一个整数数组,表示另一种物品(如饮料)的价格列表。x:一个整数,表示允许的最大组合价格。
方法逻辑
- 创建一个名为
lis的ArrayList<Integer>对象,但在方法体中并未使用(可能是未完成的代码或遗留的变量)。 - 创建一个名为
sum的Integer对象,并初始化为0,用于累计满足条件的组合数量。 - 遍历
staples数组,如果元素值小于等于x,则sum增加1。 - 遍历
drinks数组,如果元素值小于等于x,则sum增加1。 - 使用嵌套循环遍历
staples和drinks数组的所有组合,如果某组合的和小于等于x,则sum增加1。 - 返回
sum值。
示例解析
-
solution(new int[]{5, 20, 5}, new int[]{5, 5, 2}, 5):- 单独满足条件的
staples有2个(5, 5),drinks有2个(5, 2)。 - 满足条件的组合有1个(5+0=5,其中0表示
drinks中的未使用项,这里为了解释方便,实际代码中未显式处理0的情况,但逻辑上可以这样理解)。 - 总和为5。
- 单独满足条件的
-
solution(new int[]{3, 10, 7}, new int[]{2, 5}, 7):- 单独满足条件的
staples有2个(3, 7),drinks有2个(2, 5)。 - 满足条件的组合有1个(3+5=8,但注意,此处解释逻辑时包含8稍大于7的情况是为了展示组合思路,实际代码中只计算小于等于7的组合,如3+2=5)。
- 但由于7=3+4这种组合在
drinks中不存在4,所以不考虑。有效组合为3+2, 7单独,2单独,5单独,3单独。 - 总和为5。
- 单独满足条件的
-
solution(new int[]{10, 15}, new int[]{5, 6}, 20):- 单独满足条件的
staples有2个(10, 15),drinks全部满足(5, 6)。 - 满足条件的组合有多个(10+5, 10+6, 15+5,注意15+6=21不满足)。
- 总和为7(两个单独项+三个组合)。
- 单独满足条件的
优化建议
- 变量
lis未使用,可以移除。 sum初始化为0时可以直接使用int类型,避免不必要的自动装箱和拆箱操作。- 代码逻辑清晰,但对于组合的处理可以考虑使用更高效的数据结构或算法,特别是在处理大数据集时。
总结
该程序通过遍历和组合计算,找出了满足特定条件的元素和组合的数量。虽然代码相对简单直接,但对于理解基本的数组遍历和条件判断很有帮助。