【009】"超市里的货物架调整"深入分析 | 豆包MarsCode AI 刷题

244 阅读4分钟

前言

在超市中,如何最大化商品销售量是一个有趣的优化问题。本文将围绕一道算法题展开分析,探讨如何通过调整货物架上的商品顺序,来尽可能多地满足顾客需求。文章将从问题定义、思路分析、代码实现和优化解读等方面,全面拆解这个问题。

题目内容

屏幕截图 2024-11-25 173049.png

问题分析

背景与问题描述

在超市中,商品被陈列在货物架上,每个格子中放有一种商品。顾客根据需求从货物架前到后依次查找商品,遇到空格子或找不到需要的商品时会离开。因此,为了尽可能多地满足顾客的需求,我们可以在顾客进入之前调整商品的顺序。

需要解决的问题是:如何调整货物架上的商品顺序,以使顾客购买的商品数量最大化?

输入与输出
  1. 输入

    • n:货物架的格子数。
    • m:顾客想要购买的商品种类数。
    • s:货物架上商品的初始顺序。
    • c:顾客想要购买的商品种类。
  2. 输出

    • 在最优调整下,顾客能够购买的最大商品数量。
关键问题
  1. 库存管理:货物架上的商品种类和数量是固定的,必须根据实际库存进行调整。
  2. 顾客需求优先满足:顾客会按照需求顺序逐一查找商品,因此需要将顾客最需要的商品优先放置在货物架前面。
限制条件
  • 每种商品的数量不可改变。
  • 货物架上最多可以容纳 nnn 件商品,因此如果顾客需求的商品在库存中不存在,则无法满足这部分需求。

思路

为实现目标,我们可以将问题分为以下几个步骤:

1. 商品库存统计

首先统计货物架上每种商品的数量,方便后续调整顺序时快速查询。可以使用 HashMap 来记录商品的种类及其数量。例如,对于 s = "abbc",统计结果为:

a: 1
b: 2
c: 1
2. 优先满足顾客需求

顾客的需求顺序是固定的,按照 c 中商品的顺序,依次判断该商品是否在库存中。如果存在,则售出一件商品并减少库存;如果不存在,则直接跳过。

3. 最优调整顺序

最优调整的本质是将货物架上的商品按照顾客需求的顺序排序。只要顾客需求的商品在货物架中存在,就可以优先满足。

具体调整思路为:

  • 遍历顾客需求列表,检查需求商品是否存在于库存中。
  • 如果存在,售出该商品并减少库存数量。
  • 如果不存在,直接跳过。

最终的售出数量即为能够满足的顾客需求数量。

代码实现

以下是具体实现的代码(基于Java语言)

import java.util.HashMap;  

public class Main {  
    public static int solution(int n, int m, String s, String c) {  
        // 商品计数  
        HashMap<Character, Integer> shelfCount = new HashMap<>();  
        
        // 统计货物架上的商品数量  
        for (char item : s.toCharArray()) {  
            shelfCount.put(item, shelfCount.getOrDefault(item, 0) + 1);  
        }  
        
        int totalSold = 0;  
        
        // 遍历顾客想要的商品,尝试出售  
        for (char customerItem : c.toCharArray()) {  
            if (shelfCount.containsKey(customerItem) && shelfCount.get(customerItem) > 0) {  
                totalSold++; // 成功售出一件商品  
                // 减少库存  
                shelfCount.put(customerItem, shelfCount.get(customerItem) - 1);  
            }  
        }  
        
        return totalSold; // 返回售出的商品总数  
    }  
    
    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. 商品库存统计
for (char item : s.toCharArray()) {
    shelfCount.put(item, shelfCount.getOrDefault(item, 0) + 1);
}
  • 作用:统计货架上每种商品的数量。

  • 关键点

    • 遍历货架商品字符串 s
    • 使用 HashMap 将商品种类作为键,数量作为值。
    • 如果商品已存在,则数量加 1;否则初始化为 1。

2. 售出商品逻辑
for (char customerItem : c.toCharArray()) {
    if (shelfCount.containsKey(customerItem) && shelfCount.get(customerItem) > 0) {
        totalSold++; // 售出商品
        shelfCount.put(customerItem, shelfCount.get(customerItem) - 1); // 减少库存
    }
}
  • 作用:按照顾客需求列表 c 检查并售出商品。

  • 关键点

    • 检查当前需求商品是否存在于库存中且库存量大于 0。
    • 若满足条件,则售出商品(totalSold++),并更新库存量(减 1)。

最后

该问题本质是一个资源分配优化问题,通过简单统计与遍历操作,找出满足顾客需求的最大商品数。该解法具有以下特点:

  • 高效性:时间复杂度为O(n+m),适用于大规模问题。
  • 可扩展性:若需处理多轮顾客需求,只需在售出后更新库存。

类似问题在实际场景中广泛存在,例如库存管理、物流优化等。该解法为相关领域提供了一个高效、简洁的解决思路。