題意
一個句子包含了若干個由空格分隔的單字,每個單字可能包含數字、小寫字母和美元符號 '$'
。如果一個單字是以美元符號 $
開頭的一串數字,則它代表一個價格。
- 例如 $100,$23,$6 代表價格,而 100,$,$1e5 不是。
給定一個表示句子的字串 sentence 和一個整數 discount,對於每個表示價格的單字,都套用 discount% 的折扣,並更新句子中的單字。所有更新後的價格需要用 二位小數 表示。
返回修改後的句子字串。
注意:所有價格最多包含 10 位數。
思路:模擬(Simulation)
先將輸入的句子分割成單字,然後遍歷每個單字檢查是否符合價格的形式,如果是的話就套用折扣,然後更新句子中的單字。最後將更新後的單字組合成修改後的句子後回傳即可。
由於折扣是固定的,所以可以先計算折扣的比例 d=100100−discount,這樣就不用每次都計算折扣比例。
但在 C++
的字串函數庫中,並沒有提供直接對字串進行格式化的函數,這裡使用 stringstream
來進行格式化。
複雜度分析
- 時間複雜度:O(n) ,其中 n 是 sentence 的長度。
- 空間複雜度: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(""); 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
的用法才能寫出來。