整数计数问题 | 豆包Marscode AI 刷题

65 阅读3分钟

题目

image.png

代码实现

def solution(word: str) -> int:
    # 将非数字字符替换为空格
    filtered_word = ''.join([char if char.isdigit() else ' ' for char in word])
    
    # 将字符串分割成整数列表
    numbers = filtered_word.split()
    
    # 将整数转换为集合,自动去除重复项
    unique_numbers = set(int(num) for num in numbers)
    
    # 返回不同整数的数目
    return len(unique_numbers)

if __name__ == '__main__':
    print(solution("a123bc34d8ef34") == 3)
    print(solution("t1234c23456") == 2)
    print(solution("a1b01c001d4") == 2)

函数分析

函数内部实现细节

过滤非数字字符

  • 在函数 solution 内部,首先使用了一个列表推导式来遍历输入字符串 word 中的每个字符 char
  • 如果字符是数字(通过 char.isdigit() 判断),就直接保留该字符;如果不是数字,就将其替换为空格。
  • 然后使用 join 方法将处理后的字符列表转换回一个字符串,存储在 filtered_word 变量中。例如,对于输入字符串 "a123bc34d8ef34",经过这一步处理后,filtered_word 将变为 "123 34 8 34"。

分割字符串为整数列表

  • 接着,使用 split 方法将 filtered_word 字符串按照空格进行分割,得到一个包含各个数字字符串的列表 numbers。以上面的例子来说,numbers 将是 ["123", "34", "8", "34"]。

转换为集合去除重复项

  • 之后,通过一个生成式表达式将 numbers 列表中的每个数字字符串转换为整数,并使用 set 函数将这些整数转换为集合 unique_numbers。集合的特性是会自动去除重复元素,所以在这个过程中,重复的整数会被去除。对于前面的例子,经过这一步后,unique_numbers 将是 {8, 123, 34}。

返回不同整数的数目

  • 最后,函数返回集合 unique_numbers 的长度,也就是不同整数的数目。

深入分析

  • 功能明确性:代码的主要功能是从给定字符串中提取出所有数字,去除重复数字后统计不同数字的个数,功能清晰直接,易于理解和维护。

  • 代码简洁性:通过合理运用列表推导式、join方法、split方法和集合推导式,在较短的代码行数内实现了较为复杂的功能,没有过多冗余代码,符合 Python 简洁高效的编程风格。

  • 潜在问题

    • 输入字符串格式假设:代码假设输入字符串只包含字母和数字,如果输入字符串包含其他特殊字符(如标点符号),代码可能无法正确处理,可能需要进一步增强输入验证和处理逻辑。
    • 性能优化空间:对于大规模输入字符串,多次使用列表推导式和join等操作可能会影响性能。可以考虑使用更高效的数据结构和算法,如re模块(正则表达式)来一次性提取数字,可能会提高处理效率。
    • 错误处理缺失:当前代码没有对可能出现的转换错误(如数字字符串无法正确转换为整数)进行处理,如果输入字符串中包含无法转换为数字的非法字符,程序可能会抛出异常而崩溃,需要添加适当的错误处理机制来增强程序的健壮性。
  • 可扩展性:若后续需要对提取的数字进行其他操作,如排序、计算总和等,代码结构相对清晰,易于在现有基础上进行扩展和修改。例如,可以在solution函数中添加参数来控制是否返回排序后的数字列表或计算数字总和等功能,而不影响现有代码的主要逻辑结构。