方向一 超市里的货物价调整 题目解析 | 豆包MarsCode AI刷题

92 阅读3分钟

image.png 好的,以下是该代码的详细思路逐步讲解:

1. 问题分析

我们需要在一个货架上找到顾客想要购买的商品数量,以满足顾客的需求。问题中的核心任务是比较货架上的商品种类和顾客的需求种类,统计货架上能够满足顾客需求的商品总数。注意,货架和顾客需求的商品种类用小写字母表示,比如 "abc" 表示货架上有三种商品,分别是 abc。总体思路其实就是一个贪心法,找到两个字符串中相同字母的个数。

2. 解决思路

目标是统计顾客想买的每种商品在货架上的数量是否足够,并计算出可以满足的总数量。

我们的思路分为以下几个步骤:

Step 1: 初始化频次表

首先,我们需要记录货架上每种商品的数量和顾客所需每种商品的数量。

  • 用两个大小为26的数组 tablestablec 来分别存储货架商品和顾客需求商品的种类数量,其中26表示所有小写字母的数量。
  • tables[i] 表示货架上字符 chr(i + ord('a')) 的数量,tablec[i] 表示顾客需求中字符 chr(i + ord('a')) 的数量。

Step 2: 统计货架和顾客需求的商品数量

我们遍历字符串 s(货架上的商品)和 c(顾客需求的商品),并更新 tablestablec 中对应的计数。

  • 对于字符串 s 中的每个字符,将其对应的 tables 中的位置加一。
  • 对于字符串 c 中的每个字符,将其对应的 tablec 中的位置加一。

Step 3: 计算满足需求的商品数

通过遍历所有可能的字母种类(即26种小写字母),我们比较 tablestablec 中每个字母的数量:

  • 对于每种字母 i,如果货架上的数量 tables[i] 大于顾客需求 tablec[i],则可以满足顾客该种商品的需求,取两者的最小值即可满足的数量。
  • 将每种字母满足的数量累加到 res 中,得到最终的满足需求的总商品数量。

3. 代码实现

根据上面的思路,代码实现如下:

def solution(n: int, m: int, s: str, c: str) -> int:
    # 初始化两个长度为26的数组来统计每种字母的频次
    tables = [0] * 26  # 用于存储货架上的商品种类数量
    tablec = [0] * 26  # 用于存储顾客所需的商品种类数量
    
    # 统计货架上的商品种类数量
    for i in s:
        tables[ord(i) - ord('a')] += 1  # 将字符转换为对应的索引位置并计数
    
    # 统计顾客需求的商品种类数量
    for i in c:
        tablec[ord(i) - ord('a')] += 1  # 将字符转换为对应的索引位置并计数
    
    # 初始化满足需求的商品总数
    res = 0
    
    # 遍历每一种商品种类,计算满足需求的商品数
    for i in range(26):
        res += min(tables[i], tablec[i])  # 取两者的最小值,即可以满足的商品数量
    
    return res  # 返回满足需求的商品总数

4. 时间复杂度分析

该代码的时间复杂度为 (O(n + m)),其中 n 是字符串 s 的长度,m 是字符串 c 的长度,因为我们只需遍历两个字符串并统计频次,之后的操作都是常数时间的数组访问。

5. 总结

该代码实现了一种高效的方法,通过频次表的方式快速统计货架上的商品是否能满足顾客需求,避免了重复扫描和复杂的字符串比较。这种方法适合处理大规模的输入。