伴学笔记1

110 阅读3分钟

在一个超市中,有一个包含 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 问题分析 我们需要理解题目的核心要求。题目中给出了几个关键信息: 货物架的格子数 n 顾客想要购买的商品种类数 m 货物架上商品的初始顺序 s 顾客想要购买的商品种类 c 我们的目标是重新安排商品顺序,使得顾客在查找过程中尽可能早地找到他们想要购买的商品。这意味着我们应该将顾客需求量大的商品放在前面。 关键思路 统计商品频率:首先,我们需要统计货物架上每种商品的频率,以及顾客想要购买的商品的频率。 排序商品:根据顾客的需求量,对商品进行排序。需求量大的商品应该排在前面。 计算最大销售量:按照排序后的商品顺序,计算最大销售量。对于每种商品,我们取其在货物架上的数量和顾客需求量中的较小值,然后累加到销售量中。 代码实现 统计商品频率: import java.util.HashMap; import java.util.Map;

public class SupermarketShelf {

public static int solution(int n, int m, String s, String c) {
    // 统计每个商品的频率
    Map<Character, Integer> productCount = new HashMap<>();
    for (char ch : s.toCharArray()) {
        productCount.put(ch, productCount.getOrDefault(ch, 0) + 1);
    }

    // 统计顾客需求的商品频率
    Map<Character, Integer> demandCount = new HashMap<>();
    for (char ch : c.toCharArray()) {
        demandCount.put(ch, demandCount.getOrDefault(ch, 0) + 1);
    }

    // 计算最大销售量
    int sold = 0;
    for (Map.Entry<Character, Integer> entry : productCount.entrySet()) {
        char product = entry.getKey();
        int productFrequency = entry.getValue();
        if (demandCount.containsKey(product)) {
            sold += Math.min(productFrequency, demandCount.get(product));
        }
    }

    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
}

} 代码说明

  • 统计商品频率:使用 HashMap 来统计货物架上每种商品的频率 (productCount) 和顾客想要购买的商品的频率 (demandCount)。

  • 计算最大销售量:遍历 productCount,对于每种商品,计算其在货物架上的数量和顾客需求量中的较小值,并累加到 sold 中。

深入分析

  • 时间复杂度:该算法的时间复杂度为 O(n + m),因为我们需要遍历货物架上的商品和顾客需求的商品。

  • 空间复杂度:空间复杂度为 O(1),因为我们只使用了常量级别的额外空间。

可能的优化

在某些情况下,如果商品种类较少,可以使用数组代替 HashMap 来提高性能。

扩展思考