🔗 🟡 2288. Apply Discount to Prices 1577

tags: 字串(String) 模擬(Simulation)

題意

一個句子包含了若干個由空格分隔的單字,每個單字可能包含數字、小寫字母和美元符號 '$'。如果一個單字是以美元符號 $ 開頭的一串數字,則它代表一個價格。

  • 例如 $100,$23,$6\text{\$}100, \text{\$}23, \text{\$}6 代表價格,而 100,$,$1e5100, \text{\$}, \text{\$}1e5 不是。

給定一個表示句子的字串 sentence\text{sentence} 和一個整數 discount\text{discount},對於每個表示價格的單字,都套用 discount%\text{discount}\% 的折扣,並更新句子中的單字。所有更新後的價格需要用 二位小數 表示。

返回修改後的句子字串。

注意:所有價格最多包含 1010 位數。

思路:模擬(Simulation)

先將輸入的句子分割成單字,然後遍歷每個單字檢查是否符合價格的形式,如果是的話就套用折扣,然後更新句子中的單字。最後將更新後的單字組合成修改後的句子後回傳即可。

由於折扣是固定的,所以可以先計算折扣的比例 d=100discount100d = \frac{100 - \text{discount}}{100},這樣就不用每次都計算折扣比例。

但在 C++ 的字串函數庫中,並沒有提供直接對字串進行格式化的函數,這裡使用 stringstream 來進行格式化。

複雜度分析

  • 時間複雜度:O(n)\mathcal{O}(n) ,其中 nnsentence\text{sentence} 的長度。
  • 空間複雜度:O(n)\mathcal{O}(n) ,我們需要建立一個新的字串來存儲修改後的句子。
1
2
3
4
5
6
7
8
9
class Solution:
def discountPrices(self, sentence: str, discount: int) -> str:
d = (100 - discount) / 100
words = sentence.split()
for i, s in enumerate(words):
if s[0] == '$' and s[1:].isdigit():
price = int(s[1:]) * d
words[i] = "$" + f"{price:.2f}"
return " ".join(words)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
string discountPrices(string sentence, int discount) {
double d = 1 - discount / 100.0;
stringstream ssin(sentence), ssout;
string w, ans;
while (ssin >> w) {
if (!ans.empty()) ans += ' ';
if (w.length() > 1 && w[0] == '$' && all_of(w.begin() + 1, w.end(), ::isdigit)) {
ssout.str(""); // clear
ssout << fixed << setprecision(2) << '$' << stoll(w.substr(1)) * d;
ans += ssout.str();
} else {
ans += w;
}
}
return ans;
}
};

寫在最後

Cover photo is generated by @ゴリラの素材屋さん, thanks for their work!

Python 寫很簡單,但用 C++ 需要查閱一下 stringstream 的用法才能寫出來。