刷题漫漫路(三)| 豆包MarsCode AI刷题

51 阅读4分钟

在解决字符串处理的问题时,尤其是需要从混合字符中提取数字的场景,组织和设计代码的思路非常重要。下面是我在处理这个特定的提取数字并统计唯一数字数量的任务时的一些心得体会,包括代码实现的思路和潜在的优化方向。

问题分析

题目要求从一个字符串中提取出所有的数字部分,并计算不同数字的个数。这里需要注意以下几点:

  1. 字符串中的非数字字符:我们需要将这些非数字字符去掉,方便后续提取数字。
  2. 前导零的处理:在数字的处理过程中,如果存在前导零,它们需要被去掉,只有当数字是0时,返回0。
  3. 唯一数字的统计:最终需要返回不同整数的数量。

思路与实现步骤

  1. 替换非数字字符:首先通过遍历字符,将所有非数字字符替换为空格,这样在后面的处理过程中可以通过空格分割出数字。
  2. 提取数字:通过 split() 方法将字符串切分为多个部分,并使用集合来存储数字。集合可以自动处理重复的数字,从而简化了在后续步骤中去重的工作。
  3. 处理前导零:在存入集合之前,使用 lstrip('0') 来移除数字前的零,如果全部被去掉导致数字为空,则将其视为0。
  4. 返回不同数字的数量:最后通过返回集合的大小来得到结果。

以下是我实现的代码:

python
def solution(word: str) -> int:  
    # 1. 将所有非数字字符替换为空格  
    word = ''.join(' ' if not char.isdigit() else char for char in word)  
    
    # 2. 提取整数并去除前导零  
    integers = set()  
    for num in word.split():  
        # 去除前导零  
        num = num.lstrip('0')  
        # 如果去除前导零后为空字符串,则视为0  
        if num == '':  
            num = '0'  
        integers.add(num)  
    
    # 3. 返回不同整数的数量  
    return len(integers)  

if __name__ == '__main__':  
    print(solution("a123bc34d8ef34") == 3)  # '123', '34', '8' = 3 unique integers  
    print(solution("t1234c23456") == 2)     # '1234', '23456' = 2 unique integers  
    print(solution("a1b01c001d4") == 2)     # '1', '4' = 2 unique integers  

代码解析

  1. 字符替换:代码的第一部分使用了生成器表达式 (.join()) 来替换非数字字符为单一空格,这使得接下来的数字提取更加方便。
  2. 集合的使用:通过 set() 存储生成的数字,可以避免手动去重,使得代码更加简洁易读。集合的特性保证了集合中只保留唯一数字。
  3. 去除前导零:字符串方法 lstrip('0') 的使用非常巧妙,简化了前导零处理的逻辑,并提供了有效的方式来得到需要的整数形式。
  4. 核心逻辑的有效性:使用 if num == '': 检查是否为空字符串,并将其处理为0。

心得体会

  1. 清晰的思路:在处理复杂字符串时,清晰的思路和系统的步骤是编写高效代码的关键。将问题拆解为小部分逐个解决,可以减少错误和混淆。
  2. 集合的优势:利用集合的特性,不仅提高了性能,也使得代码更加简洁。特别是在需要处理唯一性的问题时,集合是一个非常好的选择。
  3. 测试用例的重要性:在设计测试用例时,我覆盖了多种情况,包括含有前导零的数字和不同字符类型的字符串。这保证了我实现的代码的鲁棒性和灵活性。
  4. 潜在优化:尽管本实现已经比较高效,但未来如果处理更大的字符串,可以考虑通过正则表达式来提取所有数字,这样可以更简洁地解决当前问题。
  5. 编程习惯的重要性:良好的编码风格和清晰的注释提高了代码的可读性,使得团队合作和后期维护更为顺畅。

总结

通过这次编码练习,我不仅巩固了字符串处理的技能,还提升了对集合等数据结构使用的理解。在面对更复杂的任务时,良好的思维方式和清晰的实现思路将对我未来的编程挑战大有裨益。这样的练习不仅有助于提高我编程的逻辑性,还能让我在解决实际问题时更加自信和高效