小U同学每天在早餐店有多种主食和饮料

72 阅读3分钟

笔记: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:一个整数,表示允许的最大组合价格。

方法逻辑

  1. 创建一个名为lisArrayList<Integer>对象,但在方法体中并未使用(可能是未完成的代码或遗留的变量)。
  2. 创建一个名为sumInteger对象,并初始化为0,用于累计满足条件的组合数量。
  3. 遍历staples数组,如果元素值小于等于x,则sum增加1。
  4. 遍历drinks数组,如果元素值小于等于x,则sum增加1。
  5. 使用嵌套循环遍历staplesdrinks数组的所有组合,如果某组合的和小于等于x,则sum增加1。
  6. 返回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类型,避免不必要的自动装箱和拆箱操作。
  • 代码逻辑清晰,但对于组合的处理可以考虑使用更高效的数据结构或算法,特别是在处理大数据集时。

总结

该程序通过遍历和组合计算,找出了满足特定条件的元素和组合的数量。虽然代码相对简单直接,但对于理解基本的数组遍历和条件判断很有帮助。