力扣每日一题 6/18 字符串/模拟

简介: 力扣每日一题 6/18 字符串/模拟

2288.价格减免 【中等

题目:

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

  • 例如 "$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 <= 10**5
  • sentence 由小写英文字母、数字、' ''$' 组成
  • sentence 不含前导和尾随空格
  • sentence 的所有单词都用单个空格分隔
  • 所有价格都是 整数且不含前导零
  • 所有价格 最多 为  10 位数字
  • 0 <= discount <= 100

分析问题:

       这道题就是在考字符串的切割和替换,我们可以按照题目要求进行模拟然后进行操作。

       首先我们将给定的字符串 sentence 根据空格进行分割,得到其中的每一个单词。随后我们遍历每个单词,如果该单词:

  • 第一个元素是‘$’。
  • 后续的元素都是数字。

       我们就进行字符串的替换操作,这里可以直接根据列表的索引来替换列表内的元素

      替换完成之后,我们还需要把列表转为字符串并且每个元素之间以空格分开,将其输出。

       这里需要注意的是,虽然每个元素后面都有空格分开,但是第一个元素前面和最后一个元素的后面是不需要空格的,这里的格式要注意。

代码实现:

class Solution:
    def discountPrices(self, sentence: str, discount: int) -> str:
        key=(100-discount)/100
        def pan(s:str):
            for j in s:
                if j in '0123456789':
                    continue
                else:return False
            return True
        ls=[x for x in sentence.split()]
        for i in range(len(ls)):
            if len(ls[i])>1 and ls[i][0]=='$':
                ve=ls[i][1:]
                if pan(ve):
                    kk=str('%.2f'%(int(ve)*key))
                    bp='$'+kk
                    ls[i]=bp
        s=''
        for p in range(len(ls)):
            s+=ls[p]
            if p!=len(ls)-1:s+=' '
        return s


总结:

详细解释

  • 首先,计算折扣系数 key ,通过 (100 - discount) / 100 得到。
  • 定义一个内部函数 pan ,用于判断一个字符串是否仅由数字组成。
  • 将输入的字符串 sentence 按空格分割为一个列表 ls
  • 遍历列表 ls 中的每个元素,如果元素长度大于 1 且以 $ 开头,提取后续部分 ve
  • 通过 pan 函数判断 ve 是否仅由数字组成,如果是,则进行折扣计算,将结果格式化为保留两位小数的字符串 kk ,并拼接 $ 得到新的价格 bp ,替换原列表中的元素。
  • 最后,将处理后的列表元素重新拼接为字符串并返回。

考察内容

  • 字符串的操作,包括分割、提取子串、拼接。
  • 列表的遍历和元素修改。
  • 自定义函数的定义和使用,用于判断字符串的组成。
  • 数值的计算和格式化输出。

可以学到

  • 如何处理包含特定格式的字符串数据。
  • 如何根据条件对列表中的元素进行修改和替换。
  • 如何定义简单的辅助函数来完成特定的判断逻辑。
  • 数值的计算与格式化控制,以满足实际需求。

“你说过,人最大的敌人是自己。”——《我的前半生》

相关文章
|
3天前
|
算法
力扣每日一题 6/23 字符串/模拟
力扣每日一题 6/23 字符串/模拟
5 1
|
3天前
力扣经典150题第四十题:同构字符串
力扣经典150题第四十题:同构字符串
6 1
|
17天前
|
算法 索引 Python
二刷力扣--字符串
二刷力扣--字符串
|
18天前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
|
21天前
|
存储 算法 数据挖掘
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
|
3天前
|
索引
力扣每日一题 6/27 字符串 贪心
力扣每日一题 6/27 字符串 贪心
5 0
|
3天前
|
Python
力扣随机一题 模拟+字符串
力扣随机一题 模拟+字符串
5 0
|
3天前
力扣每日一题 6/22 字符串/贪心
力扣每日一题 6/22 字符串/贪心
4 0
|
3天前
|
算法
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
6 0
|
3天前
|
算法 Java
力扣经典150题第二十三题:找出字符串中第一个匹配项的下标
力扣经典150题第二十三题:找出字符串中第一个匹配项的下标
2 0