持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
一、题目描述
句子 是由若干个单词组成的字符串,单词之间用单个空格分隔,其中每个单词可以包含数字、小写字母、和美元符号 '$' 。如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个价格。
- 例如
"$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 <= 105sentence由小写英文字母、数字、' '和'$'组成sentence不含前导和尾随空格sentence的所有单词都用单个空格分隔- 所有价格都是 正 整数且不含前导零
- 所有价格 最多 为
10位数字 0 <= discount <= 100
题目来源:力扣
二、思路分析
题目要求我们输出原字符串 sentence 经过修改后的新字符串 str ,修改目标为:将 sentece 中的价格按照折扣减免。(原字符串由若干个单词组成,单词之间用单个空格分隔)
什么字符表示价格呢?
如果单词的形式为 $ + 一个非负实数 ,那么这个单词就表示一个价格。
什么字符不是价格呢?
"100"、'$' 、 "2$3" 、$2$3 、 $nb 都不能表示价格。
怎么打折扣呢?
以前学数学我们就知道了:①新价格 = 原价格 - 折扣价,②折扣价 = 原价格 * 打折率。
题目约束:
①新价格要保留小数点后两位;②原字符串中只包含数字、小写字母、和 '$'。
解题思路:
- 新建一个字符串
str,用来记录修改后的字符串。 - 根据空格切割原字符串,会得到一个数组
arr。 - 遍历
arr数组,判断遍历到的当前元素是否价格:若不是,则将 当前元素+空格 存进str;若当前元素是一个价格,则将原价格打折以得到新价格(新价格要精确到小数点后两位),并将 $+新价格+空格 存进str(后面解释)。 - 遍历完
arr数组后,str已经是原字符串修改后的新字符串了,只不过在末尾会有一个空格,将其删除即是最终答案了。
难点:判断 arr 数组元素是否价格。
解决:我们知道 arr 数组是原字符串根据空格切割后得到的数组,因此我们判断①元素首位是否为 '$' || ②元素首位为'$' ,它之后的字符中是否还含有 '$' || ③元素首位为'$' ,它之后的字符是否为数字。上面三种情况中,只要有一种为否,就代表该元素不是价格;否则该元素就是价格。
三、AC 代码
/**
* @param {string} sentence
* @param {number} discount
* @return {string}
*/
var discountPrices = function(sentence, discount) {
let str = '';
const arr = sentence.split(' ');
for (let word of arr) {
// 获取元素首位之后的字符,同时方便计算新价格
const money = word.length > 1 ? word.slice(1, word.length) : word;
if (word[0] !== '$' || money.indexOf('$') > -1 || Number.isNaN(Number(money))) {
str += word + ' ';
} else {
// 得到新价格后要精确到小数点后两位
let num = (money - money * (discount / 100)).toFixed(2);
str += '$' + num + ' ';
}
}
// 修改后的字符串最后会有一个空格,要删掉
return str.slice(0, str.length - 1);
}