问题:超市里的货物架调整
问题描述 在一个超市里,有一个包含个格子的货物架,每个格子中放有一种商品,商品用小写字母a到z表示,当顾客进入超市时,他们会依次从第一个格子查找到第个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。 输入变量说明: • n:货物架的格子数 • m:顾客想要购买的商品种类数 • s:货物架上商品的初始顺序 • c:顾客想要购买的商品种类
代码实现
import java.util.HashMap;
import java.util.Map;
public class Main {
public static int solution(int n, int m, String s, String c) {
// 统计每种商品的需求量
Map<Character, Integer> demand = new HashMap<>();
for (char ch : c.toCharArray()) {
demand.put(ch, demand.getOrDefault(ch, 0) + 1);
}
// 统计货架上每种商品的数量
Map<Character, Integer> stock = new HashMap<>();
for (char ch : s.toCharArray()) {
stock.put(ch, stock.getOrDefault(ch, 0) + 1);
}
// 计算可以卖出的商品数量
int sold = 0;
for (char ch : demand.keySet()) {
if (stock.containsKey(ch)) {
sold += Math.min(demand.get(ch), stock.get(ch));
}
}
return sold;
}
public static void main(String[] args) {
System.out.println(solution(3, 4, "abc", "abcd") == 3);
System.out.println(solution(4, 2, "abbc", "bb") == 2);
System.out.println(solution(5, 4, "bcdea", "abcd") == 4);
}
}
代码解释
-
导入必要的包:
import java.util.HashMap; import java.util.Map;这里导入了
HashMap和Map,用于存储商品的需求量和库存量。 -
定义
Main类:public class Main {这是 Java 程序的主类,包含
solution方法和main方法。 -
定义
solution方法:public static int solution(int n, int m, String s, String c) {这个方法接收四个参数:
n:货架的格子数m:顾客想要购买的商品种类数s:货架上商品的初始顺序c:顾客想要购买的商品种类
-
统计每种商品的需求量:
Map<Character, Integer> demand = new HashMap<>(); for (char ch : c.toCharArray()) { demand.put(ch, demand.getOrDefault(ch, 0) + 1); }使用
HashMap统计每种商品的需求量。getOrDefault方法用于获取当前商品的需求量,如果商品不存在则返回默认值0,然后加1。 -
统计货架上每种商品的数量:
Map<Character, Integer> stock = new HashMap<>(); for (char ch : s.toCharArray()) { stock.put(ch, stock.getOrDefault(ch, 0) + 1); }
需求统计:我们首先统计每种商品的需求量,使用 Map<Character, Integer> 来存储。 库存统计:然后统计货架上每种商品的数量,同样使用 Map<Character, Integer> 来存储。 计算售出数量:最后,我们计算可以卖出的商品数量。对于每种商品,我们取需求量和库存量的最小值,累加得到最终的售出数量。 这个解决方案的时间复杂度为 O(n + m),其中 n 是货架上的商品数量,m 是顾客的需求种类数。