2288. 价格减免
句子 是由若干个单词组成的字符串,单词之间用单个空格分隔,其中每个单词可以包含数字、小写字母、和美元符号 '$'
。如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个价格。
"$100"
、"$23"
和 "$6.75"
表示价格,而 "100"
、"$"
和 "2$3"
不是。注意:本题输入中的价格均为整数。
给你一个字符串 sentence
和一个整数 discount
。对于每个表示价格的单词,都在价格的基础上减免 discount%
,并 更新 该单词到句子中。所有更新后的价格应该表示为一个 恰好保留小数点后两位 的数字。
返回表示修改后句子的字符串。
示例 1:
输入:sentence = "there are $1 $2 and 5$ candies in the shop", discount = 50 输出:"there are $0.50 $1.00 and 5$ candies in the shop" 解释: 表示价格的单词是 "$1" 和 "$2" 。 - "$1" 减免 50% 为 "$0.50" ,所以 "$1" 替换为 "$0.50" 。 - "$2" 减免 50% 为 "$1" ,所以 "$1" 替换为 "$1.00" 。
示例 2:
输入:sentence = "1 2 $3 4 $5 $6 7 8$ $9 $10$", discount = 100 输出:"1 2 $0.00 4 $0.00 $0.00 7 8$ $0.00 $10$" 解释: 任何价格减免 100% 都会得到 0 。 表示价格的单词分别是 "$3"、"$5"、"$6" 和 "$9"。 每个单词都替换为 "$0.00"。
提示:
1 <= sentence.length <= 105
sentence
由小写英文字母、数字、' '
和 '$'
组成sentence
不含前导和尾随空格sentence
的所有单词都用单个空格分隔10
位数字0 <= discount <= 100
原站题解
rust 解法, 执行用时: 15 ms, 内存消耗: 4.6 MB, 提交时间: 2024-06-18 06:50:48
impl Solution { pub fn discount_prices(sentence: String, discount: i32) -> String { let d = 1.0 - discount as f64 / 100.0; sentence.split_whitespace() .map(|w| if w.starts_with('$') && w[1..].parse::<i64>().is_ok() { format!("${:.2}", w[1..].parse::<i64>().unwrap() as f64 * d) } else { w.to_string() }) .collect::<Vec<_>>() .join(" ") } }
javascript 解法, 执行用时: 95 ms, 内存消耗: 58.6 MB, 提交时间: 2024-06-18 06:50:32
/** * @param {string} sentence * @param {number} discount * @return {string} */ var discountPrices = function(sentence, discount) { const d = 1 - discount / 100; const a = sentence.split(" "); for (let i = 0; i < a.length; i++) { const w = a[i]; if (/^\$[0-9]+$/.test(w)) { a[i] = `$${(parseFloat(w.substring(1)) * d).toFixed(2)}`; } } return a.join(" "); };
cpp 解法, 执行用时: 119 ms, 内存消耗: 32 MB, 提交时间: 2024-06-18 06:50:15
class Solution { public: string discountPrices(string sentence, int discount) { double d = 1 - discount / 100.0; stringstream ss(sentence); string ans, w; while (ss >> w) { // 一边分割,一边加到答案中 if (!ans.empty()) { ans += ' '; } if (w.length() > 1 && w[0] == '$' && all_of(w.begin() + 1, w.end(), ::isdigit)) { stringstream s; s << fixed << setprecision(2) << '$' << stoll(w.substr(1)) * d; ans += s.str(); } else { ans += w; } } return ans; } };
python3 解法, 执行用时: 140 ms, 内存消耗: 17.8 MB, 提交时间: 2023-07-20 09:26:27
class Solution: def discountPrices(self, sentence: str, discount: int) -> str: lis = sentence.split() for i, s in enumerate(lis): if s[0] == '$': try: v = int(s[1:]) * (1 - discount / 100) lis[i] = '${:.2f}'.format(v) except: continue return ' '.join(lis)
python3 解法, 执行用时: 216 ms, 内存消耗: 18.7 MB, 提交时间: 2023-07-20 09:25:50
# 正则 import re class Solution: def __init__(self) -> None: self.discount = 0 def discountPrices(self, sentence: str, discount: int) -> str: self.discount = discount price_pattern = re.compile("^\$(\d+\.?\d*)$") words = sentence.split(" ") ret = [] for word in words: ret.append(re.sub(price_pattern, self.repl, word)) return " ".join(ret) def repl(self, matched): price = float(matched.group(1)) price = price * (1 - self.discount / 100) return f"${price:.2f}"
python3 解法, 执行用时: 100 ms, 内存消耗: 18.4 MB, 提交时间: 2023-07-20 09:24:50
class Solution: def discountPrices(self, sentence: str, discount: int) -> str: s = list(sentence.split(' ')) for i, word in enumerate(s): if word[0] == '$' and word[1:].isdigit(): newword = float(word[1:]) * (100 - discount) / 100 newword = "%.2f" % newword s[i] = '$' + str(newword) return ' '.join(s)
java 解法, 执行用时: 225 ms, 内存消耗: 54.4 MB, 提交时间: 2023-07-20 09:23:32
class Solution { public String discountPrices(String sentence, int discount) { String[] strs = sentence.split(" "); // 根据空格分隔每个单词 StringBuilder sb = new StringBuilder(); // 字符串拼接 for(int i = 0; i < strs.length; i++) { String s = strs[i]; // 获取当前单词 if(s.matches("[$]{1}[0-9]+")) { // 正则表达式判断是否负责题目规则:有且仅有1个$,加上1个或多个数字 s = s.substring(1, s.length()); // 剔除$符号 double d = Double.valueOf(s); // 转成double d = d - d * ((double)discount / 100); // 减去折扣 strs[i] = "$" + String.format("%.2f", d); // 加上$符号,取两位小数点 } sb.append(strs[i]); if(i < strs.length - 1) { // 不是最后一个单词 sb.append(" "); // 后面加多个空格 } } return sb.toString(); } }
golang 解法, 执行用时: 36 ms, 内存消耗: 6.9 MB, 提交时间: 2023-07-20 09:21:56
func discountPrices(sentence string, discount int) string { sp := strings.Split(sentence, " ") for i, s := range sp { if s[0] == '$' { if v, err := strconv.Atoi(s[1:]); err == nil { sp[i] = fmt.Sprintf("$%.2f", float64(v*(100-discount))/100) } } } return strings.Join(sp, " ") }