leetcode
leetcode 1951 ~ 2000
价格减免

价格减免

难度:

标签:

题目描述

代码结果

运行时间: 83 ms, 内存: 17.9 MB


/*
 * 题目思路:
 * 1. 使用Java Stream处理句子中的每个单词。
 * 2. 判断是否为价格,如果是则计算折扣后的价格,并保留两位小数。
 * 3. 使用Collectors.joining方法连接处理后的单词。
 */

import java.util.Arrays;
import java.util.stream.Collectors;

public class Solution {
    public String discountPrices(String sentence, int discount) {
        return Arrays.stream(sentence.split(" "))
                .map(word -> {
                    if (word.startsWith("$") && word.length() > 1 && isNumber(word.substring(1))) {
                        double originalPrice = Double.parseDouble(word.substring(1));
                        double discountedPrice = originalPrice * (1 - discount / 100.0);
                        return "$" + String.format("%.2f", discountedPrice);
                    } else {
                        return word;
                    }
                })
                .collect(Collectors.joining(" "));
    }

    private boolean isNumber(String s) {
        try {
            Double.parseDouble(s);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}

解释

方法:

此题解首先通过空格将句子分割成单词列表。然后计算出折扣后的价格因子 p,即原价的剩余百分比。接着遍历单词列表,对于每个单词,检查其是否以美元符号'$'开头并且其后跟随的字符全为数字,满足条件则视为有效的价格。对于这些价格单词,将其后的数字部分转换为整数并乘以 p,再格式化为两位小数的字符串形式,并更新到原位置。最后,将处理后的单词列表重新拼接成字符串返回。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
如何确保在处理中不会遇到`$`后面跟着的数字超过10位的情况,从而导致整数溢出?
为了避免处理大数字导致的整数溢出问题,可以在转换整数前检查数字的长度。如果数字长度超过安全处理的位数(例如10位),则可以拒绝处理该数字或者使用更大范围的数据类型如Python的`long`或使用库如`decimal`来处理大数值。此外,Python的整型在较新版本中是动态扩展的,理论上可以处理任意大的整数,只受限于系统内存。
🦆
在使用`v[1:].isdigit()`来判断一个单词是否表示价格时,如果有其他字符例如小数点或负号怎么办?
使用`v[1:].isdigit()`方法仅检查字符串是否全部由数字组成,不包括小数点或负号。如果价格字符串中包含小数点或负号,`isdigit()`将返回`False`,该字符串就不会被视为有效的价格格式。这保证了只处理格式严格为`$`后直接跟随整数的情况。如果需要处理包含小数或负数的价格,需要更复杂的检测逻辑来分析和验证字符串。
🦆
您在题解中使用了`int(v[1:]) * p`来计算打折后的价格,这里是否考虑了浮点数运算的精度问题?
浮点数运算可能引起精度问题,尤其是在金融计算中。在这个题解中,将整数转换为浮点数进行运算后,结果通过格式化为两位小数来限制精度。这种处理在许多实际应用中是可接受的,但对于需要高度精确的金融应用,可能需要使用如Python的`decimal.Decimal`类来进行精确的十进制计算,避免浮点误差。
🦆
为什么选择先将单词列表转换为整数再计算折扣,而不是直接在字符串上操作以避免可能的数据类型转换错误?
将价格从字符串转换为整数可以确保在进行数学运算时的准确性和效率。直接在字符串上进行数学运算需要先解析字符串中的数字,这不仅增加了实现的复杂性,而且容易出错。转换为整数后,可以利用标准的数学运算来进行折扣计算,这样的处理更直观、更可靠。此外,整数和浮点数操作通常比字符串解析和操作更快,更适合性能敏感的应用。

相关问题