第七天刷题:超市里的货物架调整问题 | 豆包MarsCode AI刷题

51 阅读6分钟

题目要求在顾客顺序寻找商品的规则下,调整货架顺序,使得能够卖出的商品数量最多。题目看似简单,但需要仔细考虑商品的分布优化和顾客的行为规则,主要涉及以下几个关键点:

  1. 货架上的商品分布:商品的初始排列不一定能够满足所有顾客需求,必须进行优化调整。

  2. 顾客购买规则:顾客从第一个格子依次查找目标商品,找到后购买并离开。

  3. 解决方案

    • 我们需要统计货架商品和顾客需求的数量,确定哪些商品可以尽可能多地满足需求。
    • 在实现过程中,需要特别注意边界情况,例如当某种商品的库存小于需求时,销售数量取较小值。

心得体会:超市商品调整与顾客购买问题

这道题目模拟了超市货架调整商品顺序以最大化销量的问题,涉及到贪心策略、数据结构(如 HashMap)、以及商品分配的优化。通过完成该题目,以下是我的学习心得和思考。


问题分析

题目要求在顾客顺序寻找商品的规则下,调整货架顺序,使得能够卖出的商品数量最多。题目看似简单,但需要仔细考虑商品的分布优化和顾客的行为规则,主要涉及以下几个关键点:

  1. 货架上的商品分布:商品的初始排列不一定能够满足所有顾客需求,必须进行优化调整。

  2. 顾客购买规则:顾客从第一个格子依次查找目标商品,找到后购买并离开。

  3. 解决方案

    • 我们需要统计货架商品和顾客需求的数量,确定哪些商品可以尽可能多地满足需求。
    • 在实现过程中,需要特别注意边界情况,例如当某种商品的库存小于需求时,销售数量取较小值。

代码实现和思路

这段代码通过 HashMap 分别统计了货架商品(s)和顾客需求(c)的数量,利用交集和最小值的策略计算最大可售商品数量。以下是代码的关键点及其分析:

统计商品数量

char[] ch1 = s.toCharArray(); char[] ch2 = c.toCharArray(); HashMap<Character, Integer> map1 = new HashMap<>(); HashMap<Character, Integer> map2 = new HashMap<>(); for (char ch : ch1) { map1.put(ch, map1.getOrDefault(ch, 0) + 1); } for (char ch : ch2) { map2.put(ch, map2.getOrDefault(ch, 0) + 1); }

  • 通过 HashMapgetOrDefault 方法统计每种商品的数量,减少了遍历统计的复杂性。

  • 这一部分的时间复杂度是 O(n + m),其中 n 是货架商品数量,m 是顾客需求数量,适合大数据量场景。

计算最大可售商品数量

for (char i = 'a'; i <= 'z'; i++) { if (map1.keySet().contains(i) && map2.keySet().contains(i)) { count += Math.min(map1.get(i), map2.get(i)); } }

  • 遍历字母表,通过 contains 判断某种商品是否既存在于货架中,又出现在顾客需求中。

  • 使用 Math.min 确保计算的商品数量不会超过库存和需求的最小值,体现了这道题目的核心思想:优化商品分配以满足顾客需求

心得体会:超市商品调整与顾客购买问题

这道题目模拟了超市货架调整商品顺序以最大化销量的问题,涉及到贪心策略、数据结构(如 HashMap)、以及商品分配的优化。通过完成该题目,以下是我的学习心得和思考。


问题分析

题目要求在顾客顺序寻找商品的规则下,调整货架顺序,使得能够卖出的商品数量最多。题目看似简单,但需要仔细考虑商品的分布优化和顾客的行为规则,主要涉及以下几个关键点:

  1. 货架上的商品分布:商品的初始排列不一定能够满足所有顾客需求,必须进行优化调整。

  2. 顾客购买规则:顾客从第一个格子依次查找目标商品,找到后购买并离开。

  3. 解决方案

    • 我们需要统计货架商品和顾客需求的数量,确定哪些商品可以尽可能多地满足需求。
    • 在实现过程中,需要特别注意边界情况,例如当某种商品的库存小于需求时,销售数量取较小值。

代码实现和思路

这段代码通过 HashMap 分别统计了货架商品(s)和顾客需求(c)的数量,利用交集和最小值的策略计算最大可售商品数量。以下是代码的关键点及其分析:

  1. 统计商品数量

    java
    复制代码
    char[] ch1 = s.toCharArray();
    char[] ch2 = c.toCharArray();
    HashMap<Character, Integer> map1 = new HashMap<>();
    HashMap<Character, Integer> map2 = new HashMap<>();
    for (char ch : ch1) {
        map1.put(ch, map1.getOrDefault(ch, 0) + 1);
    }
    for (char ch : ch2) {
        map2.put(ch, map2.getOrDefault(ch, 0) + 1);
    }
    
    • 通过 HashMapgetOrDefault 方法统计每种商品的数量,减少了遍历统计的复杂性。
    • 这一部分的时间复杂度是 O(n + m),其中 n 是货架商品数量,m 是顾客需求数量,适合大数据量场景。
  2. 计算最大可售商品数量

    java
    复制代码
    for (char i = 'a'; i <= 'z'; i++) {
        if (map1.keySet().contains(i) && map2.keySet().contains(i)) {
            count += Math.min(map1.get(i), map2.get(i));
        }
    }
    
    • 遍历字母表,通过 contains 判断某种商品是否既存在于货架中,又出现在顾客需求中。
    • 使用 Math.min 确保计算的商品数量不会超过库存和需求的最小值,体现了这道题目的核心思想:优化商品分配以满足顾客需求
  3. 测试用例验证

    java
    复制代码
    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);
    }
    
    • 测试用例覆盖了以下情况:

      • 顾客需求多于货架库存。
      • 顾客需求与库存部分重合。
      • 顾客需求与库存完全重合但数量不同。
    • 验证了代码的正确性和鲁棒性。


代码优化思考

  1. 降低遍历范围
    当前代码固定遍历了所有可能的小写字母(26 次),可以优化为只遍历 map1map2 的交集。

    • 优化后的逻辑:

      java
      复制代码
      for (char key : map1.keySet()) {
          if (map2.containsKey(key)) {
              count += Math.min(map1.get(key), map2.get(key));
          }
      }
      
  2. 空间复杂度优化
    如果货架商品数量较大且种类繁多,可以在构造 map1 时直接减去顾客需求,不必再创建 map2,实现单个 HashMap 统计,降低空间复杂度。


心得与收获

  1. 数据结构应用
    HashMap 是解决统计问题的利器,特别是在涉及键值对关系时,可以有效避免多次遍历的复杂性。通过这道题,我加深了对 HashMap 的熟练掌握。
  2. 贪心策略
    本题的核心思想是贪心策略,即每种商品的销售数量取库存和需求的最小值,保证局部最优性。
  3. 边界条件分析
    本题的一个挑战是如何优雅地处理库存不足或顾客需求不存在的情况,代码通过 getOrDefaultcontains 方法自然地处理了这些问题。