python-leetcode-1736. 替换隐藏数字得到的最晚时间

1736. 替换隐藏数字得到的最晚时间 - 力扣(LeetCode)

目标是:将字符串 time 中的 ? 替换为合适的数字,使它表示的时间是 “最晚的有效时间”。


步骤分析:

格式为 hh:mm,例如 "2?:?0""?4:5?""??:??" 等。

我们要找的时间是 00:00 到 23:59 之间的最大合法时间。


解法思路:

我们可以从左到右检查每一位:

  • time[0] 是小时的十位:

    • 如果 time[0] == '?'

      • 如果 time[1] == '?' 或者 <= '3',最大可以是 '2'

      • 否则(即 time[1] > '3'),最大只能是 '1'

  • time[1] 是小时的个位:

    • 如果 time[1] == '?'

      • 如果 time[0] == '2',最大只能是 '3'

      • 否则(即 time[0]'0''1'),最大是 '9'

  • time[3] 是分钟的十位:

    • 如果 time[3] == '?',最大是 '5'

  • time[4] 是分钟的个位:

    • 如果 time[4] == '?',最大是 '9'


代码实现(Python):

def maximumTime(time: str) -> str:
    time = list(time)

    if time[0] == '?':
        if time[1] == '?' or time[1] <= '3':
            time[0] = '2'
        else:
            time[0] = '1'

    if time[1] == '?':
        if time[0] == '2':
            time[1] = '3'
        else:
            time[1] = '9'

    if time[3] == '?':
        time[3] = '5'

    if time[4] == '?':
        time[4] = '9'

    return ''.join(time)

示例:

  • 输入:"2?:?0" → 输出:"23:50"

  • 输入:"0?:3?" → 输出:"09:39"

  • 输入:"??:??" → 输出:"23:59"

<think>好的,用户想要用Python实现字符串查找与替换的代码示例。首先,我需要回忆Python中字符串处理的基本方法。记得Python的字符串是不可变的,所以替换操作实际上是生成新的字符串。 用户可能需要的例子包括简单的替换,比如用replace()方法替换所有出现的子串。例如,把所有的"apple"换成"orange",这应该是最基础的用法。还要考虑替换次数限制的情况,比如只替换前两次出现的地方。 然后,用户可能需要更复杂的替换,比如使用正则表达式。这时候应该提到re模块的sub()方法。比如替换所有数字或者特定模式的字符串。可能需要给出一个例子,比如用正则表达式替换日期格式或者隐藏电话号码的部分数字。 另外,根据用户提供的引用内容,特别是引用3和4提到的LeetCode问题,用户可能还关心根据索引位置进行替换的情况。例如,在特定位置检查是否存在源字符串,然后替换为目标字符串。这时候需要处理索引和可能的多个替换操作,并且要注意从后往前处理以避免索引变化的问题。 还要注意Python字符串是不可变的,所以在多次替换时,每次替换都会生成新字符串。这可能影响性能,但在一般应用中影响不大。需要提醒用户如果需要高效处理大量数据,可能需要其他方法。 用户可能分不清什么时候用replace(),什么时候用正则表达式。需要解释两者的区别:replace()适用于固定字符串的替换,而正则表达式适用于模式匹配。比如替换所有数字或者符合某种格式的字符串。 另外,引用5提到字符串不可变,所以每次替换都是新建字符串。这点需要强调,避免用户误解可以修改原字符串。 可能需要给出多个示例,覆盖不同的场景,包括简单替换、限制次数、正则替换、根据索引替换。这样用户可以根据自己的需求选择合适的方案。 最后,检查是否所有示例都符合Python语法,特别是正则表达式部分是否正确使用re.sub(),以及索引替换时的排序问题。确保代码示例能够直接运行,没有错误。 总结回答结构:先介绍基本方法replace(),给出示例;然后介绍正则表达式替换;接着处理根据索引替换的情况,可能参考LeetCode题的解法;最后总结不同方法的适用场景。确保引用相关的引用来源,比如提到不可变性和替换次数时引用5,提到索引替换时引用3和4。</think>### Python字符串查找与替换代码示例 #### 1. 基础替换方法:`str.replace()` `str.replace(old, new[, count])` 方法可替换所有匹配的子字符串,支持限制替换次数: ```python text = "apple banana apple cherry apple" # 替换所有"apple"为"orange" result = text.replace("apple", "orange") print(result) # 输出:orange banana orange cherry orange # 仅替换前2次出现的"apple" result = text.replace("apple", "orange", 2) print(result) # 输出:orange banana orange cherry apple ``` *特性:直接替换固定字符串,适合简单场景[^2][^5]* --- #### 2. 正则表达式替换:`re.sub()` 通过正则表达式实现模式匹配替换: ```python import re text = "订单号:ABX-2023,日期:2024-07-15" # 替换所有数字为"*" masked = re.sub(r'\d', '*', text) print(masked) # 输出:订单号:ABX-****,日期:****-**-** # 替换日期格式(YYYY-MM-DD) formatted = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text) print(formatted) # 输出:订单号:ABX-2023,日期:07/15/2024 ``` *特性:支持复杂模式匹配,需导入`re`模块[^1]* --- #### 3. 按索引替换LeetCode 833方案) 根据特定位置进行条件替换,需处理多个替换操作: ```python def find_replace_string(s, indices, sources, targets): replacements = sorted(zip(indices, sources, targets), key=lambda x: -x[0]) for i, src, tgt in replacements: if s.startswith(src, i): s = s[:i] + tgt + s[i+len(src):] return s # 示例:在索引7处替换"cd"为"ffff" print(find_replace_string("abcdxyzcd", [7,2], ["cd","cd"], ["ffff","eeee"])) # 输出:abeeeexyzffff ``` *特性:需要倒序处理索引避免位置偏移[^3][^4]* --- ### 方法对比 | 方法 | 适用场景 | 时间复杂度 | |--------------|----------------------------------|------------------| | `str.replace`| 固定字符串替换 | $O(n)$ | | `re.sub` | 模式匹配替换(如数字、日期格式) | $O(n)$~$O(n^2)$ | | 索引替换 | 精准定位替换 | $O(k \cdot n)$ | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值