【103完美整数窥探】
问题描述
一个整数如果由相同的数字构成,则称为完美整数。例如:
1、11、333是完美整数。12、19、101是不完美整数。
现在,你需要计算给定区间 [x, y] 中有多少个整数是完美整数。
思路解析
- 将数字转换为字符串
- 然后对于由相同数字构成的字符串转换后的集合长度为1
- 转换为集合:
set(str_list)将字符串数组转换为一个集合。集合会自动去除重复的元素。 - 检查集合长度:
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进行了优化
优化
- 减少字符串转换次数:每次循环都将数字转换为字符串,这会增加不必要的开销。可以考虑在循环外部进行一次转换。
- 减少集合创建次数:每次循环都创建一个新的集合,这也会增加开销。可以考虑在循环外部创建一个集合,并在循环内部重用它。
- 使用生成器表达式:生成器表达式可以减少内存使用,特别是在处理大范围的数字时。
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)
-
range(x, y + 1):生成从x到y的整数序列。 -
for num in range(x, y + 1):遍历这个整数序列。 -
if len(set(str(num))) == 1:检查当前数字num是否是完美整数。具体步骤如下:str(num):将数字转换为字符串。set(str(num)):将字符串转换为集合,去除重复字符。len(set(str(num))) == 1:检查集合的长度是否为1,即所有字符是否相同。
-
1:如果条件为真,生成器表达式会生成1。 -
sum(...):对生成器表达式生成的所有1进行求和,得到完美整数的数量。
为什么使用生成器表达式可以减少内存使用?
生成器表达式不会立即生成整个列表,而是按需生成元素。这意味着在处理大量数据时,生成器表达式不会一次性将所有数据加载到内存中,从而减少内存使用。
示例
假设 x = 1 和 y = 1000000,生成器表达式 sum(1 for num in range(x, y + 1) if len(set(str(num))) == 1) 不会一次性生成包含所有数字的列表,而是逐个生成数字并检查是否为完美整数。这使得它在处理大范围的数字时更加高效。
感悟
这就是Marscode让我觉得神奇的地方,AI不仅能根据我的编辑区生成优化代码,还能解释优化内存的原因