AI刷题从简单题103完美整数窥探Marscode | 豆包MarsCode AI刷题

97 阅读4分钟

【103完美整数窥探】

问题描述

一个整数如果由相同的数字构成,则称为完美整数。例如:

  • 111333 是完美整数。
  • 1219101 是不完美整数。

现在,你需要计算给定区间 [x, y] 中有多少个整数是完美整数。

思路解析

  • 将数字转换为字符串
  • 然后对于由相同数字构成的字符串转换后的集合长度为1
  1. 转换为集合set(str_list) 将字符串数组转换为一个集合。集合会自动去除重复的元素。
  2. 检查集合长度len(unique_set) == 1 检查集合的长度是否为1。如果集合的长度为1,说明原数组中的所有字符串都相同。

这种方法的时间复杂度是 O(n),其中 n 是数组的长度,因为集合的插入操作平均时间复杂度是 O(1)。

答题代码

def solution(x, y):
    # Edit your code here
    cnt=0
    for num in range(x,y+1):
       # 将字符串数组转换为集合
        unique_set = set(str(num))
        # 检查集合的长度是否为1
        if (len(unique_set) == 1):
            cnt=cnt+1
    return cnt

遇到的问题

我发现运行这段代码的时候运行时间比以往其他题代码的时间长 让AI进行了优化

优化

  1. 减少字符串转换次数:每次循环都将数字转换为字符串,这会增加不必要的开销。可以考虑在循环外部进行一次转换。
  2. 减少集合创建次数:每次循环都创建一个新的集合,这也会增加开销。可以考虑在循环外部创建一个集合,并在循环内部重用它。
  3. 使用生成器表达式:生成器表达式可以减少内存使用,特别是在处理大范围的数字时。
def solution(x, y):
    # 使用生成器表达式来计算完美整数的数量
    cnt = sum(1 for num in range(x, y + 1) if len(set(str(num))) == 1)
    return cnt

if __name__ == "__main__":
    # 添加你的测试用例
    print(solution(1, 10) == 9)
    print(solution(2, 22) == 10)

生成器表达式

生成器表达式是一种用于创建生成器的简洁语法,它类似于列表推导式,但不会立即生成整个列表,而是按需生成元素。这使得生成器表达式在处理大量数据时可以显著减少内存使用。

生成器表达式的语法

生成器表达式的语法类似于列表推导式,但使用圆括号 () 而不是方括号 []。例如:

(expression for item in iterable if condition)

(expression for item in iterable if 

condition)

解释 sum(1 for num in range(x, y + 1) if len(set(str(num))) == 1)

  1. range(x, y + 1):生成从 x 到 y 的整数序列。

  2. for num in range(x, y + 1):遍历这个整数序列。

  3. if len(set(str(num))) == 1:检查当前数字 num 是否是完美整数。具体步骤如下:

    • str(num):将数字转换为字符串。
    • set(str(num)):将字符串转换为集合,去除重复字符。
    • len(set(str(num))) == 1:检查集合的长度是否为1,即所有字符是否相同。
  4. 1:如果条件为真,生成器表达式会生成 1

  5. sum(...):对生成器表达式生成的所有 1 进行求和,得到完美整数的数量。

为什么使用生成器表达式可以减少内存使用?

生成器表达式不会立即生成整个列表,而是按需生成元素。这意味着在处理大量数据时,生成器表达式不会一次性将所有数据加载到内存中,从而减少内存使用。

示例

假设 x = 1 和 y = 1000000,生成器表达式 sum(1 for num in range(x, y + 1) if len(set(str(num))) == 1) 不会一次性生成包含所有数字的列表,而是逐个生成数字并检查是否为完美整数。这使得它在处理大范围的数字时更加高效。

感悟

这就是Marscode让我觉得神奇的地方,AI不仅能根据我的编辑区生成优化代码,还能解释优化内存的原因