题目

/**
 * 圣诞活动预热开始啦,汉堡店推出了全新的汉堡套餐。为了避免浪费原料,请你帮他们制定合适的制作计划。
 *
 * 给你两个整数 tomatoSlices 和 cheeseSlices,分别表示番茄片和奶酪片的数目。不同汉堡的原料搭配如下:
 *
 * 巨无霸汉堡:4 片番茄和 1 片奶酪
 * 小皇堡:2 片番茄和 1 片奶酪
 * 请你以 [total_jumbo, total_small]([巨无霸汉堡总数,小皇堡总数])的格式返回恰当的制作方案,使得剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlices 的数量都是 0。
 *
 * 如果无法使剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlices 的数量为 0,就请返回 []。
 *
 *
 *
 * 示例 1:
 *
 * 输入:tomatoSlices = 16, cheeseSlices = 7
 * 输出:[1,6]
 * 解释:制作 1 个巨无霸汉堡和 6 个小皇堡需要 4*1 + 2*6 = 16 片番茄和 1 + 6 = 7 片奶酪。不会剩下原料。
 * 示例 2:
 *
 * 输入:tomatoSlices = 17, cheeseSlices = 4
 * 输出:[]
 * 解释:只制作小皇堡和巨无霸汉堡无法用光全部原料。
 * 示例 3:
 *
 * 输入:tomatoSlices = 4, cheeseSlices = 17
 * 输出:[]
 * 解释:制作 1 个巨无霸汉堡会剩下 16 片奶酪,制作 2 个小皇堡会剩下 15 片奶酪。
 * 示例 4:
 *
 * 输入:tomatoSlices = 0, cheeseSlices = 0
 * 输出:[0,0]
 * 示例 5:
 *
 * 输入:tomatoSlices = 2, cheeseSlices = 1
 * 输出:[0,1]
 *
 *
 * 提示:
 *
 * 0 <= tomatoSlices <= 10^7
 * 0 <= cheeseSlices <= 10^7
 * 
 * @Author hang.wang
 * @Date 2023/12/25 15:07
 */
public class Class1276 {

    public static void main(String[] args) {
        Class1276 clazz = new Class1276();
        System.out.println(clazz.numOfBurgers(16, 7));
        System.out.println(clazz.numOfBurgers(17, 4));
        System.out.println(clazz.numOfBurgers(4, 17));
        System.out.println(clazz.numOfBurgers(0, 0));
        System.out.println(clazz.numOfBurgers(2, 1));
    }

    public List<Integer> numOfBurgers(int tomatoSlices, int cheeseSlices) {
        if (tomatoSlices % 2 != 0) {
            return Collections.emptyList();
        }
        if (cheeseSlices * 2 > tomatoSlices) {
            return Collections.emptyList();
        }
        if (cheeseSlices * 4 < tomatoSlices) {
            return Collections.emptyList();
        }

        int small = cheeseSlices;
        int big = 0;
        while (small * 2 + big * 4 != tomatoSlices) {
            if (small == 0) {
                return Arrays.asList(0, 0);
            }
            small--;
            big++;
        }

        return Arrays.asList(big, small);
    }
}

解析

有点类似鸡兔同笼,但是其中的边界值需要考虑,例如如果给的值为0,返回的结果都为0;如果给的条件不符合(例如奇数),返回空List
先按照最小的汉堡消耗进行计算,然后依次减少小汉堡数量,增加大汉堡数量(根据条件已知:奶酪数=大汉堡数+小汉堡数)
做该题目时优先考虑把各种情况排除掉

  1. 奇数时,返回空值
  2. 当奶酪全做小汉堡时,又超过西红柿数,返回空值
  3. 当奶酪全做大汉堡时,又小于西红柿数,返回空值
  4. 当做循环中途,小汉堡数为0时,返回 0, 0
  5. 当循环结束后,返回对应数值
最后修改:2023 年 12 月 25 日
如果觉得我的文章对你有用,请随意赞赏