价格减免
难度:
标签:
题目描述
代码结果
运行时间: 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位的情况,从而导致整数溢出?
▷🦆
在使用`v[1:].isdigit()`来判断一个单词是否表示价格时,如果有其他字符例如小数点或负号怎么办?
▷🦆
您在题解中使用了`int(v[1:]) * p`来计算打折后的价格,这里是否考虑了浮点数运算的精度问题?
▷🦆
为什么选择先将单词列表转换为整数再计算折扣,而不是直接在字符串上操作以避免可能的数据类型转换错误?
▷