问题描述
小C来到了一家餐馆,准备点一些菜。已知该餐馆有n道菜,第i道菜的售价为wi。小C准备点一些价格相同的菜,但小C不会点单价超过m的菜。小C想知道,自己最多可以点多少道菜。
思路分析
明确目标:要在给定的n道菜中,找出价格不超过m的菜里,相同价格的菜数量最多的情况,也就是统计出符合价格限制条件下,同一价格的菜最多能有多少道。
利用数据结构辅助:考虑使用HashMap来记录每种价格以及对应的菜的数量。键(key)为菜的价格,值(value)为该价格的菜出现的次数,这样方便后续遍历查找数量最多的那一组价格相同的菜。
解题步骤
1.创建用于统计的数据结构并初始化:创建一个HashMap<Integer, Integer>类型的priceCountMap,用于存储价格和对应数量的映射关系。
2.遍历菜品价格数组并统计: 通过for循环遍历给定的菜品价格数组w,循环变量i从0开始,直到w.length-1。对于每一个价格w[i],先判断它是否小于等于m(即满足小C的价格限制条件),如果满足,就在priceCountMap中进行操作:使用priceCountMap.getOrDefault(w[i], 0)来获取当前价格w[i]对应的已统计数量(如果该价格还未在HashMap中出现过,就返回默认值0),然后将这个数量加1后再通过put方法更新回priceCountMap中,这样就完成了对应价格的菜数量的统计。
3.查找最大数量:初始化一个变量maxCount为0,用于记录同一价格的菜的最大数量。通过for循环遍历priceCountMap的键(即所有已统计过的价格),对于每一个价格price,使用priceCountMap.get(price)获取该价格对应的菜的数量,然后通过Math.max函数将这个数量与当前的maxCount进行比较,取较大值更新maxCount,这样遍历完所有价格后,maxCount就记录了相同价格的菜数量的最大值。
4.返回结果:最后返回maxCount,它就是小C在满足价格限制条件下,最多能点的同一价格的菜的数量。
代码解释和注释
import java.util.HashMap;
import java.util.Map;
public class Main {
// solution方法用于找出价格不超过m的菜中,相同价格的菜数量最多是多少
// 参数m表示价格上限,w是存储各道菜价格的整型数组
public static long solution(int m, int[] w) {
// 创建一个HashMap,用于存储价格(键)和对应价格的菜的数量(值)的映射关系
Map<Integer, Integer> priceCountMap = new HashMap<>();
// 遍历菜品价格数组w,i为当前菜品价格的索引
for (int i = 0; i < w.length; i++) {
// 判断当前菜品价格w[i]是否小于等于价格上限m
if (w[i] <= m) {
// 使用getOrDefault方法获取当前价格对应的菜的数量,如果不存在则返回0
// 然后将数量加1后更新到priceCountMap中,实现对应价格菜数量的统计
priceCountMap.put(w[i], priceCountMap.getOrDefault(w[i], 0) + 1);
}
}
long maxCount = 0; // 初始化最大数量为0,用于记录相同价格的菜数量的最大值
// 遍历priceCountMap的所有键(即所有已统计的价格)
for (int price : priceCountMap.keySet()) {
// 获取当前价格对应的菜的数量,并与当前的maxCount比较,取较大值更新maxCount
maxCount = Math.max(maxCount, priceCountMap.get(price));
}
return maxCount; // 返回相同价格的菜数量的最大值,即小C最多能点的同一价格的菜的数量
}
public static void main(String[] args) {
// 调用solution方法传入相应参数进行测试,判断返回结果是否等于预期结果,并输出比较结果(true或false)
System.out.println(solution(6, new int[]{2, 3, 3, 6, 6, 6, 9, 9, 23}) == 3);
System.out.println(solution(4, new int[]{1, 2, 4, 4, 4}) == 3);
System.out.println(solution(4, new int[]{5, 5, 5, 5, 6, 7, 8}) == 4);
}
}
总结
功能实现:代码成功实现了既定的功能,即根据给定的价格上限和菜品价格数组,准确统计出在价格限制条件下,相同价格的菜数量最多能有多少道,通过合理运用HashMap来记录和查找数据,完成了对菜品数量的统计与最大值的筛选。
优点: 逻辑清晰:整体代码结构条理分明,先是统计不同价格的菜的数量,再通过遍历找出数量最大值,各个步骤分工明确,易于阅读和理解其实现思路。合理利用数据结构:借助HashMap的特性,方便地实现了价格与对应菜品数量的映射存储与查询,使得代码在处理这类需要统计不同值出现次数的问题时更加简洁高效,避免了复杂的多重循环嵌套等繁琐操作。
可改进之处: 输入验证方面:代码对于输入的参数m和数组w没有进行充分的合法性验证,例如没有检查m是否为合理的正数,数组w是否为null等情况,在实际应用中若传入不符合要求的数据可能导致程序出现异常,可添加相应的输入验证逻辑增强程序的健壮性。性能优化角度:如果菜品价格数组w的长度非常大,在频繁调用HashMap的put和getOrDefault方法时可能会有一定的性能开销,可考虑是否有更高效的算法或者数据结构组合来进一步优化统计过程,比如先对数组w进行排序(如果合适的话),然后利用排序后的顺序特点来更快速地统计相同价格的菜的数量等优化思路。
总体而言,这段代码实现了基本的功能需求,有着清晰的逻辑与合理的数据结构运用,但在输入验证和性能优化方面还有一定的提升空间,可根据具体的应用场景进一步完善优化。