问题描述
在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 n 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
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
题解
function solution(n, m, s, c) {
// 创建一个计数器来记录每种商品的需求量
const demand = {};
for (let item of c) {
if (demand[item]) {
demand[item]++;
} else {
demand[item] = 1;
}
}
// 创建一个数组来存储调整后的商品顺序
const adjustedShelf = [];
// 遍历初始顺序,将顾客想要的商品按需添加到调整后的顺序中
for (let item of s) {
if (demand[item] && demand[item] > 0) {
adjustedShelf.push(item);
demand[item]--;
}
}
// 返回调整后的顺序中商品的数量,即为最多可以卖出的商品数量
return adjustedShelf.length;
}
function main() {
console.log(solution(3, 4, "abc", "abcd") === 3);
console.log(solution(4, 2, "abbc", "bb") === 2);
console.log(solution(5, 4, "bcdea", "abcd") === 4);
}
main();
解题思路
为了最大化销售商品的数量,我们需要根据顾客想要购买的商品种类来调整货物架上的商品顺序。具体来说,我们应该将顾客想要购买的商品尽可能地放在货物架的前面,并且按照顾客购买的顺序排列。
-
需求计数:
- 使用一个对象
demand来记录每种商品的需求量。
- 使用一个对象
-
调整商品顺序:
- 遍历初始商品顺序
s,将顾客想要的商品按需添加到调整后的顺序adjustedShelf中,并减少相应的需求量。
- 遍历初始商品顺序
-
返回结果:
- 返回调整后的顺序中商品的数量,即为最多可以卖出的商品数量。
这种方法确保了我们尽可能多地满足顾客的需求,从而最大化销售数量。