Solving Leetcode Interviews in Seconds with AI: Apply Discount Every n Orders
Introduction
In this blog post, we will explore how to solve the LeetCode problem "1357" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.
Problem Statement
There is a supermarket that is frequented by many customers. The products sold at the supermarket are represented as two parallel integer arrays products and prices, where the ith product has an ID of products[i] and a price of prices[i]. When a customer is paying, their bill is represented as two parallel integer arrays product and amount, where the jth product they purchased has an ID of product[j], and amount[j] is how much of the product they bought. Their subtotal is calculated as the sum of each amount[j] (price of the jth product). The supermarket decided to have a sale. Every nth customer paying for their groceries will be given a percentage discount. The discount amount is given by discount, where they will be given discount percent off their subtotal. More formally, if their subtotal is bill, then they would actually pay bill ((100 - discount) / 100). Implement the Cashier class: Cashier(int n, int discount, int[] products, int[] prices) Initializes the object with n, the discount, and the products and their prices. double getBill(int[] product, int[] amount) Returns the final total of the bill with the discount applied (if any). Answers within 10-5 of the actual value will be accepted. Example 1: Input ["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]]] Output [null,500.0,4000.0,800.0,4000.0,4000.0,7350.0,2500.0] Explanation 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]); // return 500.0. 1st customer, no discount. // bill = 1 100 + 2 200 = 500. cashier.getBill([3,7],[10,10]); // return 4000.0. 2nd customer, no discount. // bill = 10 300 + 10 100 = 4000. cashier.getBill([1,2,3,4,5,6,7],[1,1,1,1,1,1,1]); // return 800.0. 3rd customer, 50% discount. // Original bill = 1600 // Actual bill = 1600 ((100 - 50) / 100) = 800. cashier.getBill([4],[10]); // return 4000.0. 4th customer, no discount. cashier.getBill([7,3],[10,10]); // return 4000.0. 5th customer, no discount. cashier.getBill([7,5,3,1,6,4,2],[10,10,10,9,9,9,7]); // return 7350.0. 6th customer, 50% discount. // Original bill = 14700, but with // Actual bill = 14700 ((100 - 50) / 100) = 7350. cashier.getBill([2,3,5],[5,3,2]); // return 2500.0. 7th customer, no discount. Constraints: 1 <= n <= 104 0 <= discount <= 100 1 <= products.length <= 200 prices.length == products.length 1 <= products[i] <= 200 1 <= prices[i] <= 1000 The elements in products are unique. 1 <= product.length <= products.length amount.length == product.length product[j] exists in products. 1 <= amount[j] <= 1000 The elements of product are unique. At most 1000 calls will be made to getBill. Answers within 10-5 of the actual value will be accepted.
Explanation
Here's a breakdown of the solution:
- Caching Prices: Create a hash map (dictionary) to store the product IDs and their corresponding prices for quick lookup.
- Bill Calculation: Iterate through the customer's order, retrieving the price for each product from the hash map and calculating the subtotal.
Discount Application: Keep track of the customer count. Apply the discount if the customer is the nth customer.
Runtime Complexity: O(m) for
getBillmethod, wheremis the number of products in the customer's order. Initialization takes O(p) where p is the number of products in the supermarket.- Storage Complexity: O(p), where
pis the number of products in the supermarket (for the price map).
Code
class Cashier:
def __init__(self, n: int, discount: int, products: list[int], prices: list[int]):
self.n = n
self.discount = discount
self.prices = {}
for i in range(len(products)):
self.prices[products[i]] = prices[i]
self.customer_count = 0
def getBill(self, product: list[int], amount: list[int]) -> float:
self.customer_count += 1
bill = 0
for i in range(len(product)):
bill += self.prices[product[i]] * amount[i]
if self.customer_count % self.n == 0:
bill = bill * ((100 - self.discount) / 100)
return float(bill)