【力扣第 295 场周赛】6079. 价格减免(中等)

74 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 <= 105
  • sentence 由小写英文字母、数字、' ' 和 '$' 组成
  • 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);
}