【字节青训】:超市里的货物架调整

65 阅读2分钟

在一个超市里,有一个包含 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

题目链接: 超市里的货物架调整 MarsCode

思路:

  1. 分别统计货物架上每种的商品数量 以及 顾客想要购买每种的商品数量 --> 可以用 哈希解决
  2. 然后要使卖出商品最多,那么我们应该根据顾客的商品需求,假如当前用户需要 a,货物架上有 n1 个 a,用户需要 n2 个 a,那么用户最多拿到 min(n1, n2) 个 a,其他同理遍历顾客需求即可

代码如下:

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;

int solution(int n, int m, string s, string c) {
    // write code here
    unordered_map<char, int> ms, mc;
    for (auto ch : s) {
        ms[ch]++;
    }
    for (auto ch : c) {
        mc[ch]++;
    }

    // 在客户需要的商品中,取客户和现有数量少的那个
    int cnt = 0;
    for (auto x : mc){
        int k = x.first;
        cnt += min(ms[k], x.second);
    }
    return cnt;
}

int main() {
    cout << (solution(3, 4, "abc", "abcd") == 3) << endl;
    cout << (solution(4, 2, "abbc", "bb") == 2) << endl;
    cout << (solution(5, 4, "bcdea", "abcd") == 4) << endl;
    return 0;
}