超市里的货物架调整(算法解析)|豆包MarsCode AI刷题

172 阅读3分钟

超市里的货物架调整

问题描述

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

问题理解

我们需要在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。具体来说,我们需要计算在最优调整下,最多可以卖出多少件商品。

数据结构选择

  1. 货架商品统计

    • 使用一个长度为26的数组 stock,其中 stock[i] 表示字母 'a' + i 在货架上的出现次数。
    • 这样可以在O(1)时间内查询和更新每种商品的数量。

算法步骤

  1. 统计货架上的商品数量

    • 遍历货架上的商品字符串 s,更新 stock 数组。
  2. 统计顾客想要购买的商品种类

    • 遍历顾客需求的字符串 c,检查货架上是否有该商品(即 stock[wantedItem - 'a'] > 0)。
    • 如果有,则增加 sales 的计数,并减少该商品的库存。

代码实现

public class Main {
    public static int solution(int n, int m, String s, String c) {
        int[] stock = new int[26];  
        for (char item : s.toCharArray()) {  
            stock[item - 'a']++;  
        }  
        int sales = 0;  
  
        // 遍历顾客想要的商品列表  
        for (char wantedItem : c.toCharArray()) {  
            // 如果货架上有这种商品  
            if (stock[wantedItem - 'a'] > 0) {  
                sales++; // 增加销售数量  
                stock[wantedItem - 'a']--; // 减少库存数量  
            }

        }  
        return sales;
    }

    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. 数组的使用

    • 定义和初始化int[] stock = new int[26];
    • 索引访问stock[item - 'a']++;
    • 数组用于统计:通过数组 stock 统计每种商品在货架上的出现次数。
  2. 字符串操作

    • 字符串转换为字符数组s.toCharArray()
    • 遍历字符数组for (char item : s.toCharArray())
    • 字符串转换为字符数组c.toCharArray()
    • 遍历字符数组for (char wantedItem : c.toCharArray())
  3. 字符操作

    • 字符减法item - 'a',将字符转换为数组索引。
    • 字符比较stock[wantedItem - 'a'] > 0,检查货架上是否有该商品。
  4. 条件判断

    • if 语句if (stock[wantedItem - 'a'] > 0),判断货架上是否有该商品。
  5. 变量操作

    • 变量自增sales++;,增加销售数量。
    • 数组元素自减stock[wantedItem - 'a']--;,减少库存数量。
  6. 方法定义和调用

    • 方法定义public static int solution(int n, int m, String s, String c)
    • 方法调用solution(3, 4, "abc", "abcd")
  7. 输出结果

    • System.out.printlnSystem.out.println(solution(3, 4, "abc", "abcd") == 3);

复杂度分析

  • 时间复杂度:O(n + m),其中 n 是货架上的商品数量,m 是顾客想要购买的商品种类数。
  • 空间复杂度:O(1),因为我们只使用了固定大小的数组。

通过这个算法,我们可以在最优调整下,计算出最多可以卖出多少件商品。