LEETCODE 1357. Apply Discount Every n Orders 解题思路分析

题目大意:

每隔 n 个顾客打折

超市里正在举行打折活动,每隔 n 个顾客会得到 discount 的折扣。

超市里有一些商品,第 i 种商品为 products[i] 且每件单品的价格为 prices[i] 。

结账系统会统计顾客的数目,每隔 n 个顾客结账时,该顾客的账单都会打折,折扣为 discount (也就是如果原本账单为 x ,那么实际金额会变成 x – (discount * x) / 100 ),然后系统会重新开始计数。

顾客会购买一些商品, product[i] 是顾客购买的第 i 种商品, amount[i] 是对应的购买该种商品的数目。

请你实现 Cashier 类:

  • Cashier(int n, int discount, int[] products, int[] prices) 初始化实例对象,参数分别为打折频率 n ,折扣大小 discount ,超市里的商品列表 products 和它们的价格 prices 。
  • double getBill(int[] product, int[] amount) 返回账单的实际金额(如果有打折,请返回打折后的结果)。返回结果与标准答案误差在 10^-5 以内都视为正确结果。

示例 1:

输入
["Cashier","getBill","getBill","getBill","getBill","getBill","getBill","getBill"]
[[3,50,[1,2,3,4,5,6,7],[100,200,300,400,300,200,100]],[[1,2],[1,2]],[[3,7],[10,10]],[[1,2,3,4,5,6,7],[1,1,1,1,1,1,1]],[[4],[10]],[[7,3],[10,10]],[[7,5,3,1,6,4,2],[10,10,10,9,9,9,7]],[[2,3,5],[5,3,2]]]
输出
[null,500.0,4000.0,800.0,4000.0,4000.0,7350.0,2500.0] 
解释
Cashier cashier = new Cashier(3,50,[1,2,3,4,5,6,7],[100,200,300,400,300,200,100]);
 cashier.getBill([1,2],[1,2]);                        // 返回 500.0, 账单金额为 = 1 * 100 + 2 * 200 = 500.
 cashier.getBill([3,7],[10,10]);                      // 返回 4000.0
 cashier.getBill([1,2,3,4,5,6,7],[1,1,1,1,1,1,1]);    // 返回 800.0 ,账单原本为 1600.0 ,但由于该顾客是第三位顾客,他将得到 50% 的折扣,所以实际金额为 1600 - 1600 * (50 / 100) = 800 。
 cashier.getBill([4],[10]);                           // 返回 4000.0
 cashier.getBill([7,3],[10,10]);                      // 返回 4000.0
 cashier.getBill([7,5,3,1,6,4,2],[10,10,10,9,9,9,7]); // 返回 7350.0 ,账单原本为 14700.0 ,但由于系统计数再次达到三,该顾客将得到 50% 的折扣,实际金额为 7350.0 。
 cashier.getBill([2,3,5],[5,3,2]);                    // 返回 2500.0

提示:

  • 1 <= n <= 10^4
  • 0 <= discount <= 100
  • 1 <= products.length <= 200
  • 1 <= products[i] <= 200
  • products 列表中 不会 有重复的元素。
  • prices.length == products.length
  • 1 <= prices[i] <= 1000
  • 1 <= product.length <= products.length
  • product[i] 在 products 出现过。
  • amount.length == product.length
  • 1 <= amount[i] <= 1000
  • 最多有 1000 次对 getBill 函数的调用。
  • 返回结果与标准答案误差在 10^-5 以内都视为正确结果。

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1357

解题思路分析:

个人感觉本题并没有什么技术含量。初始化时,建立一个Map,记录下每种商品对应的价格。然后再建立一个计数器。 在getBill 方法中,先为计数器加一,如果计数器等于了题目给出的n,证明该用户是幸运用户,它的商品可以打折,同时将计数器归零。否则按照原价结账即可。

实现代码:

// 记录每种商品对应的价格
Map<Integer, Integer> priceMap=new HashMap<>();
// 折扣
int mDiscount;
// 间隔人数
int mN;
// 当前人的index
int current;
public Cashier(int n, int discount, int[] products, int[] prices) {
    for(int i=0;i<products.length;i++){
        priceMap.put(products[i],prices[i]);
    }
    mN=n;
    mDiscount = discount;
}

public double getBill(int[] product, int[] amount) {
    // 当前人的index加一
    current++;
    // 计算当前人购买商品总价格
    double price=0;
    for(int i=0;i<product.length;i++){
        price+=priceMap.get(product[i])*amount[i];
    }
    // 如果当前人是第n个人,该人可以享受打折
    if(current==mN){
        price-=price*mDiscount/100;
        current=0;
    }
    return price;
}

本题解法执行时间为105ms。

Runtime: 105 ms, faster than 85.46% of Java online submissions for Apply Discount Every n Orders.

Memory Usage: 63.5 MB, less than 100.00% of Java online submissions for Apply Discount Every n Orders.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-1357-apply-discount-every-n-orders-解题思路分析/
此条目发表在leetcode分类目录,贴了, , , 标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。