题目
/**
* 圣诞活动预热开始啦,汉堡店推出了全新的汉堡套餐。为了避免浪费原料,请你帮他们制定合适的制作计划。
*
* 给你两个整数 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
先按照最小的汉堡消耗进行计算,然后依次减少小汉堡数量,增加大汉堡数量(根据条件已知:奶酪数=大汉堡数+小汉堡数)
做该题目时优先考虑把各种情况排除掉
- 奇数时,返回空值
- 当奶酪全做小汉堡时,又超过西红柿数,返回空值
- 当奶酪全做大汉堡时,又小于西红柿数,返回空值
- 当做循环中途,小汉堡数为0时,返回 0, 0
- 当循环结束后,返回对应数值