这篇文章将为大家分享候选人在Amazon面试中的经历,尤其是如何解答一道涉及到购物车促销规则的编程题。希望通过详细的讲解和示例,能够帮助准备面试的你更好地理解和应对类似的题目。
面试场景
在这次面试中,面试官向我展示了一道题目,让我设计一个用于促销的功能。具体要求如下:
You're working at Amazon retail and you're in-charge of implementing a method/function to be used by the Promotions team to apply a discount to each individual item in the checkout cart. The function is used to find items that meets a certain promotion criteria.
There are currently two on-going promotions, the criteria for each promotion is as follows:
- Items in the cart that are a certain price (e.g. >$20).
- Items in the cart that belong to a certain product group. Product groups can be (Clothes, Hardware, Media, Toy, Food).
Given this information:
- Design the Cart and Item classes
- Create the method/function that will find the items for each of the use cases above
候选人:商品价格可以是浮点数吗?
面试官:是的,可以是浮点数。你能举几个可能的促销标准的例子吗?
候选人:比如,价格在某个范围内的商品,属于某一特定产品类型的商品,或者名称中包含某个关键词的商品。
面试官:好的,那你可以开始设计你的解决方案了。
设计思路
为了实现上述要求,候选人决定分几步来进行设计和实现:
- 定义商品类型的枚举类(ProductGroup):
- 该类包括五种商品组:Clothes, Hardware, Media, Toy, Food。
- 使用枚举类可以确保商品类型的唯一性和可读性,同时也能避免硬编码字符串带来的潜在错误。
- 定义商品类(Item):
- 该类包含名称、价格和商品组三个属性。
- 商品类的价格属性定义为浮点数类型,以便于处理不同的价格范围和精度要求。
- 定义购物车类(Cart):
- 该类用于存储商品,并包含添加商品和获取符合促销标准的商品的方法。
- 购物车类包含一个方法,该方法接受一个促销标准对象,并遍历购物车中的所有商品,返回符合该标准的商品列表。
- 定义一个抽象促销标准类(PromotionCriteria):
- 该类通过继承实现不同的促销标准类,如价格范围、商品组、名称关键词等。
- 抽象促销标准类是一个基类,包含一个抽象方法
match
。具体的促销标准类通过继承该基类,实现match
方法,用于判断某个商品是否符合特定标准。
- 实现多个促销标准类:
- 价格范围标准类用于判断商品价格是否在指定范围内。
- 商品组标准类用于判断商品是否属于指定的商品组。
- 名称关键词标准类用于判断商品名称中是否包含指定关键词。
在实现过程中,面试官对我的设计和实现提出了一些问题和建议:
面试官:你可以解释一下为什么使用枚举类来定义商品类型吗?
候选人:使用枚举类可以确保商品类型的唯一性和可读性,同时也能避免硬编码字符串带来的潜在错误。
面试官:在定义商品类时,你是如何考虑价格属性的?
候选人:商品类的价格属性定义为浮点数类型,以便于处理不同的价格范围和精度要求。
面试官:购物车类中获取符合促销标准的商品方法是如何设计的?
候选人:购物车类包含一个方法,该方法接受一个促销标准对象,并遍历购物车中的所有商品,返回符合该标准的商品列表。
面试官:能否详细解释一下抽象促销标准类的设计思路?
候选人:抽象促销标准类是一个基类,包含一个抽象方法match
。具体的促销标准类通过继承该基类,实现match
方法,用于判断某个商品是否符合特定标准。
面试官:你提到了不同的促销标准类,能否举例说明一下?
候选人:当然可以。例如,价格范围标准类用于判断商品价格是否在指定范围内;商品组标准类用于判断商品是否属于指定的商品组;名称关键词标准类用于判断商品名称中是否包含指定关键词。
面试官:你是如何考虑到组合多个促销标准的情况的?
候选人:为了处理多个促销标准的组合情况,我设计了一个AndCriteria类和一个OrCriteria类,分别用于处理“与”和“或”的逻辑组合。这样可以实现更复杂的促销规则。
在实现过程中,我还遇到了一些技术细节上的挑战和面试官的进一步提问:
面试官:你如何确保促销标准可以灵活扩展,以应对未来可能增加的促销规则?
候选人:我设计了一个抽象的促销标准基类,并通过继承和实现不同的促销标准子类,使得我们可以很方便地扩展新的促销规则。例如,如果未来需要根据商品的品牌或库存数量来进行促销,我们只需新增对应的子类即可。
面试官:你提到的价格范围标准类如何处理边界情况?例如,价格恰好等于20美元的商品是否符合促销标准?
候选人:在设计价格范围标准类时,我考虑了边界情况。我们可以通过设置价格范围的上下限来灵活控制是否包含边界值。例如,可以通过参数设置是否包含最低价和最高价。
面试结束后,候选人对整个设计进行了总结,并与面试官讨论了可能的优化和改进方向。
通过这次面试经验分享,希望能帮助大家更好地准备Amazon的技术面试。我们提供面试代面,面试辅助服务,力求提高每一位候选人的面试成功率。如果您也有兴趣,欢迎联系我们。
![](https://csoahelp.com/wp-content/uploads/2024/05/image-39.png)