超市里的货物架调整
问题描述
在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 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
的计数,并减少该商品的库存。
- 遍历顾客需求的字符串
代码实现
java代码解读
复制代码
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),因为我们只使用了固定大小的数组。
通过这个算法,我们可以在最优调整下,计算出最多可以卖出多少件商品。
。