掘金刷题-超市里的货物架调整 | 豆包MarsCode AI刷题

51 阅读2分钟

问题描述

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

思路

  • 空格子问题:在这个问题中,我们的解题目标是让客户尽可能多的在商店中找到想要的商品,但是如果客户碰到了空格子就会离开,而我们能够自由摆放商品的位置,那么这个空格子直接摆到最后就行,不需要可以去考虑。
  • 摆放顺序:题目中说了我们可以自由调整,那么其实根本不需要可以去摆放,只需要查看所有的商品中是否包含客户想要的那个商品就行。

AC代码


public class Main {
    public static int solution(int n, int m, String s, String c) {
        // write code here
        int result=0;
        StringBuffer bf=new StringBuffer(s);
        for(int i=0;i<m;i++){
            if(bf.toString().contains(String.valueOf(c.charAt(i)))){
                   int index=bf.indexOf(String.valueOf(c.charAt(i)));
                   bf.deleteCharAt(index);
                   result++;
            }
        }
        return result;
    }

    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);
    }
}

注意当用户购买了一件商品以后要将这件商品从货架上移除。

总结

这道题目的解题思路就是利用贪心策略得到全局最优解,将空格子放到最后,将客户想要购买的商品调整顺序放到前面,通过局部最优推导出全局最优解,计算能够销售的最大值。

心得体会

这道题目虽然是简单的贪心算法,但实际上如果能够快速理解题目的意思,知道题目的目的,也可以直接用巧妙的方式直接算出,如题解中的不需要操作字符串模拟将商品重新排序的过程,而是直接查找货架上是否有客户需要的商品。