列表

详情


2288. 价格减免

句子 是由若干个单词组成的字符串,单词之间用单个空格分隔,其中每个单词可以包含数字、小写字母、和美元符号 '$' 。如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个价格。

注意:本题输入中的价格均为整数。

给你一个字符串 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"。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: string discountPrices(string sentence, int discount) { } };

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, " ")
}

上一题