A sentence is a string of single-space separated words where each word can contain digits, lowercase letters, and the dollar sign '$'
. A word represents a price if it is a sequence of digits preceded by a dollar sign.
"$100"
, "$23"
, and "$6"
represent prices while "100"
, "$"
, and "$1e5"
do not.You are given a string sentence
representing a sentence and an integer discount
. For each word representing a price, apply a discount of discount%
on the price and update the word in the sentence. All updated prices should be represented with exactly two decimal places.
Return a string representing the modified sentence.
Note that all prices will contain at most 10
digits.
Example 1:
Input: sentence = "there are $1 $2 and 5$ candies in the shop", discount = 50 Output: "there are $0.50 $1.00 and 5$ candies in the shop" Explanation: The words which represent prices are "$1" and "$2". - A 50% discount on "$1" yields "$0.50", so "$1" is replaced by "$0.50". - A 50% discount on "$2" yields "$1". Since we need to have exactly 2 decimal places after a price, we replace "$2" with "$1.00".
Example 2:
Input: sentence = "1 2 $3 4 $5 $6 7 8$ $9 $10$", discount = 100 Output: "1 2 $0.00 4 $0.00 $0.00 7 8$ $0.00 $10$" Explanation: Applying a 100% discount on any price will result in 0. The words representing prices are "$3", "$5", "$6", and "$9". Each of them is replaced by "$0.00".
Constraints:
1 <= sentence.length <= 105
sentence
consists of lowercase English letters, digits, ' '
, and '$'
.sentence
does not have leading or trailing spaces.sentence
are separated by a single space.10
digits.0 <= discount <= 100
When you get asked this question in a real-life environment, it will often be ambiguous (especially at FAANG). Make sure to ask these questions in that case:
The brute force method for applying a discount to a list of prices involves going through each price individually. For each price, we will calculate the discounted amount and subtract it from the original price to find the final discounted price.
Here's how the algorithm would work step-by-step:
def apply_discount_brute_force(prices, discount_percentage):
discounted_prices = []
# Iterate through each original price to apply discount
for original_price in prices:
# Calculate the discount amount based on percentage
discount_amount = original_price * (discount_percentage / 100)
# Determine the final discounted price
final_price = original_price - discount_amount
# Add the discounted price to the result
discounted_prices.append(final_price)
return discounted_prices
The best way to solve this problem is to efficiently apply a discount to each price. We'll look at each price individually, figure out the discount amount, and then subtract that from the original price to get the final price. This avoids recalculating discounts or doing unnecessary work.
Here's how the algorithm would work step-by-step:
def apply_discount_to_prices(prices, discount):
discounted_prices = []
# Iterate through each price to apply the discount
for original_price in prices:
# Calculate the discount amount
discount_amount = (discount / 100) * original_price
# Subtract the discount from the original price
final_price = original_price - discount_amount
# Store the final price
discounted_prices.append(final_price)
# Return the list of discounted prices
return discounted_prices
Case | How to Handle |
---|---|
Null prices array | Throw IllegalArgumentException or return null/empty list, depending on requirements/contract |
Empty prices array | Return an empty list since there are no prices to discount |
Null discount value | Throw IllegalArgumentException or return the original prices array unmodified, depending on requirements/contract |
Discount value outside the range 0-100 (e.g., negative or > 100) | Throw IllegalArgumentException or return original prices, handling it as an invalid discount. |
Large prices array (potential performance issues) | Ensure algorithm has O(n) time complexity to handle large input efficiently, avoiding nested loops |
Prices contain very large numbers (potential integer overflow) | Use data types like long or double to prevent integer overflow during calculations if necessary |
Floating point precision issues when applying the discount | Use BigDecimal for precise calculations or round the result to a certain number of decimal places to avoid representation errors |
Prices array contains negative values | Throw IllegalArgumentException or assume prices should not be negative and handle them appropriately (e.g., treat as zero, or return an error). |