leetcode
leetcode 1251 ~ 1300
每隔 n 个顾客打折

每隔 n 个顾客打折

难度:

标签:

题目描述

代码结果

运行时间: 92 ms, 内存: 28.6 MB


/* 思路:
   1. 使用 Java Stream API 优化代码。
   2. 使用 IntStream 和 mapToDouble 方法简化账单计算。
*/
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;

public class Cashier {
    private int n;
    private int discount;
    private int customerCount;
    private Map<Integer, Integer> productPriceMap;

    public Cashier(int n, int discount, int[] products, int[] prices) {
        this.n = n;
        this.discount = discount;
        this.customerCount = 0;
        productPriceMap = new HashMap<>();
        for (int i = 0; i < products.length; i++) {
            productPriceMap.put(products[i], prices[i]);
        }
    }

    public double getBill(int[] product, int[] amount) {
        customerCount++;
        double total = IntStream.range(0, product.length)
                         .mapToDouble(i -> productPriceMap.get(product[i]) * amount[i])
                         .sum();
        if (customerCount % n == 0) {
            total -= (discount * total / 100.0);
        }
        return total;
    }
}

解释

方法:

这个题解的思路是首先在构造函数中创建一个字典 price_map 将产品 ID 和其价格对应起来,以便快速查找每个产品的价格。然后,在 getBill 函数中,遍历顾客购买的每种产品和数量,计算总账单金额。如果顾客是每 n 个顾客之一,则给予折扣。折扣是通过将总账单金额减去其与折扣比例的乘积来计算的。最后,如果给予了折扣,则重置顾客计数器;否则,增加顾客计数器。

时间复杂度:

O(m)

空间复杂度:

O(p)

代码细节讲解

🦆
构造函数中使用了字典来映射产品ID和价格,这种数据结构选择的依据是什么?为什么不使用其他类型的数据结构?
字典在Python中是基于哈希表实现的,可以提供平均时间复杂度为O(1)的快速查找功能。这对于getBill方法中需要频繁根据产品ID查询价格的操作是非常高效的。相比之下,如果使用列表或数组,我们需要遍历整个数据结构来查找价格,其时间复杂度为O(n),效率较低。因此,字典是处理这种键值对映射关系的理想选择。
🦆
如何处理在product数组中存在但在products初始化列表中不存在的商品ID?即getBill方法中如果某个商品ID不存在于price_map中应如何处理?
如果在getBill方法中遇到product数组中存在但不在price_map中的商品ID,这通常表示输入错误或商品数据不完整。一种处理方式是在尝试获取价格之前检查该商品ID是否存在于price_map中。如果不存在,可以选择抛出一个异常或返回一个错误信息,通知调用者该商品ID无效,或者忽略该商品ID并继续处理其他商品。具体的处理策略应根据实际业务需求和错误处理策略来确定。
🦆
getBill方法中,顾客计数器的更新是在计算折扣之后进行的,这种设计有什么特定的原因吗?
顾客计数器的更新放在计算折扣之后是为了确保在计算当前顾客的账单时能正确判断其是否应该享受折扣。如果计数器在折扣计算前就更新,那么每到第n个顾客时,计数器已经被重置,这将导致第一个顾客(实际上是第n+1个顾客)被错误地视为应该打折的顾客。因此,先进行账单计算和折扣处理,然后再更新计数器,可以保证顾客和折扣的正确匹配。
🦆
在计算折扣时使用了`(self.discount * total_bill) / 100`的表达式,这种计算方式是否会因为浮点数的精度问题而导致计算误差?如果会,有什么可能的解决办法?
是的,使用浮点数进行金钱计算可能会引入精度问题,因为浮点数在表示一些分数时可能不精确。为了避免这种问题,可以采用整数来表示所有的金额(例如以最小货币单位如分来计算),或者使用Python的decimal模块,它提供了更精确的十进制浮点运算。使用decimal可以有效防止因浮点数精度问题导致的计算误差,特别是在金钱交易处理中非常有用。

相关问题