超市里的货物架调整
问题描述
在一个超市里,有一个包含 nn 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 nn 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
n:货物架的格子数m:顾客想要购买的商品种类数s:货物架上商品的初始顺序c:顾客想要购买的商品种类
测试样例
样例1:
输入:
n = 3 ,m = 4 ,s = "abc" ,c = "abcd"
输出:3
样例2:
输入:
n = 4 ,m = 2 ,s = "abbc" ,c = "bb"
输出:2
样例3:
输入:
n = 5 ,m = 4 ,s = "bcdea" ,c = "abcd"
输出:4
问题理解
我们需要在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。具体来说,我们需要计算在最优调整下,最多可以卖出多少件商品。
数据结构选择
-
货架商品统计:
- 使用一个长度为26的数组
stock,其中stock[i]表示字母'a' + i在货架上的出现次数。 - 这样可以在O(1)时间内查询和更新每种商品的数量。
- 使用一个长度为26的数组
算法步骤
-
统计货架上的商品数量:
- 遍历货架上的商品字符串
s,更新stock数组。
- 遍历货架上的商品字符串
-
统计顾客想要购买的商品种类:
- 遍历顾客需求的字符串
c,检查货架上是否有该商品(即stock[wantedItem - 'a'] > 0)。 - 如果有,则增加
sales的计数,并减少该商品的库存。
- 遍历顾客需求的字符串
代码实现
public class Main {
public static int solution(int n, int m, String s, String c) {
int[] stock = new int[26];
for (char item : s.toCharArray()) {
stock[item - 'a']++;
}
int sales = 0;
// 遍历顾客想要的商品列表
for (char wantedItem : c.toCharArray()) {
// 如果货架上有这种商品
if (stock[wantedItem - 'a'] > 0) {
sales++; // 增加销售数量
stock[wantedItem - 'a']--; // 减少库存数量
}
}
return sales;
}
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);
}
}
知识点总结
-
数组的使用:
- 定义和初始化:
int[] stock = new int[26]; - 索引访问:
stock[item - 'a']++; - 数组用于统计:通过数组
stock统计每种商品在货架上的出现次数。
- 定义和初始化:
-
字符串操作:
- 字符串转换为字符数组:
s.toCharArray() - 遍历字符数组:
for (char item : s.toCharArray()) - 字符串转换为字符数组:
c.toCharArray() - 遍历字符数组:
for (char wantedItem : c.toCharArray())
- 字符串转换为字符数组:
-
字符操作:
- 字符减法:
item - 'a',将字符转换为数组索引。 - 字符比较:
stock[wantedItem - 'a'] > 0,检查货架上是否有该商品。
- 字符减法:
-
条件判断:
- if 语句:
if (stock[wantedItem - 'a'] > 0),判断货架上是否有该商品。
- if 语句:
-
变量操作:
- 变量自增:
sales++;,增加销售数量。 - 数组元素自减:
stock[wantedItem - 'a']--;,减少库存数量。
- 变量自增:
-
方法定义和调用:
- 方法定义:
public static int solution(int n, int m, String s, String c) - 方法调用:
solution(3, 4, "abc", "abcd")
- 方法定义:
-
输出结果:
- System.out.println:
System.out.println(solution(3, 4, "abc", "abcd") == 3);
- System.out.println:
复杂度分析
- 时间复杂度:O(n + m),其中 n 是货架上的商品数量,m 是顾客想要购买的商品种类数。
- 空间复杂度:O(1),因为我们只使用了固定大小的数组。
通过这个算法,我们可以在最优调整下,计算出最多可以卖出多少件商品。