2288-价格减免

Raphael Liu Lv10

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

  • 例如 "100""23""6" 表示价格,而 "100""""1e5 不是。

给你一个字符串 sentence 表示一个句子和一个整数 discount 。对于每个表示价格的单词,都在价格的基础上减免 discount%
,并 更新 该单词到句子中。所有更新后的价格应该表示为一个 恰好保留小数点后两位 的数字。

返回表示修改后句子的字符串。

注意:所有价格 最多10 位数字。

示例 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

首先用 istringstream 输入流 与 getline(iss, t, ' ') 获取由空格分隔的每个单词,然后判断该单词是否是一个“价格单词”。(也可以直接 while (iss >> t),默认就是以空格作为分隔符)

至于保留小数点后两位的问题,可以用 ostringstream 较方便地解决(另外 istringstream 与 ostringstream 也都可以直接写作 stringstream):

1
2
3
4
ostringstream oss;
oss << fixed << setprecision(2) << price;

oss.str();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
string discountPrices(string sentence, int discount) {
string res;
istringstream iss(sentence);
string t;
while (getline(iss, t, ' ')) { // while (iss >> t)
bool isPrice = (t.size() > 1 && t[0] == '');
if (isPrice) {
for (int i = 1; i < t.size(); ++i) {
if (t[i] == '' || t[i] < '0' || t[i] > '9') {
isPrice = 0; break;
}
}
}
if (isPrice) {
string p = t.substr(1);
double price = stod(p);
price *= (100 - discount) * 0.01;

ostringstream oss;
oss << fixed << setprecision(2) << price;

res += '' + oss.str() + ' ';
} else {
res += t + ' ';
}
}
res.pop_back();
return res;
}
};
 Comments
On this page
2288-价格减免