力扣每日一题 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 ,替换原列表中的元素。
  • 最后,将处理后的列表元素重新拼接为字符串并返回。

考察内容

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

可以学到

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

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

目录
相关文章
|
2月前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
34 1
|
2月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
25 9
|
2月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
18 0
|
2月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
30 0
|
2月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
19 0
|
2月前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
20 0
|
2月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
15 0
|
4月前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘
|
4月前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标
|
4月前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)