今天想写一个心得总结,昨天晚上开了直播班会,又收获了很多关于实习、面试等等职场相关的知识,感激不尽,但是更想写一个今天刷的题目的分析来让我的想法能清晰有逻辑些
完美整数计数器的心路历程
在最近的一次编程练习中,我遇到了一个既有趣又具有挑战性的问题:计算给定区间 [x, y] 中有多少个整数是完美整数。所谓完美整数,是指由相同数字组成的整数,比如 11、333 等。这不仅是一个数学上的趣味问题,也是一个很好的编程练习,它让我有机会深入思考如何高效地处理字符串和数字的关系,以及如何优化循环和条件判断。
算法设计
为了解决这个问题,我首先定义了一个辅助函数 is_perfect_number(n),用于判断一个整数是否为完美整数。这个函数的基本思路是将整数转换成字符串形式,然后检查字符串中所有字符是否相同。如果字符串中字符的集合大小为1,说明这个整数是由同一个数字重复组成,因此它是完美整数。
接着,我实现了主函数 solution(x, y),它的目的是计算区间 [x, y] 内有多少个完美整数。这个函数通过遍历给定区间内的每一个整数,并调用 is_perfect_number() 函数来判断该整数是否为完美整数。如果是,则增加计数器 count 的值。
实现步骤
- 定义辅助函数:创建
is_perfect_number(n)函数,该函数接收一个整数作为参数,将其转换为字符串,然后通过集合的特性来判断字符串中是否有超过一种不同的字符。如果有且仅有一种字符,则该整数为完美整数。
def is_perfect_number(n):
"""判断一个整数是否为完美整数"""
str_n = str(n)
return len(set(str_n)) == 1
- 主函数实现:创建
solution(x, y)函数,该函数遍历从x到y区间内的每一个整数,使用is_perfect_number()函数检查每一个整数是否为完美整数。如果是,则累加计数器count。
def solution(x, y):
"""计算给定区间 [x, y] 中有多少个整数是完美整数"""
count = 0
for i in range(x, y + 1):
if is_perfect_number(i):
count += 1
return count
- 返回结果:遍历完成后,
solution()函数返回计数器count的值,即区间[x, y]内完美整数的数量。
代码实现
下面是具体的实现代码:
def is_perfect_number(n):
"""判断一个整数是否为完美整数"""
str_n = str(n)
return len(set(str_n)) == 1
def solution(x, y):
"""计算给定区间 [x, y] 中有多少个整数是完美整数"""
count = 0
for i in range(x, y + 1):
if is_perfect_number(i):
count += 1
return count
if __name__ == "__main__":
测试用例
print(solution(1, 10)) 应该输出 9
print(solution(2, 22)) 应该输出 10
print(solution(10, 100)) 应该输出 18
print(solution(100, 1000)) 应该输出 18
print(solution(1000, 10000)) 应该输出 18
心路历程
在解决这个问题的过程中,我遇到了一些挑战。最初,我对如何高效地判断一个整数是否为完美整数感到有些棘手。但是,通过将整数转换为字符串并利用集合的特性,我找到了一个简洁而有效的方法来解决这个问题。此外,我还考虑了性能问题,特别是在处理大区间时,如何减少不必要的计算。虽然在这个特定的问题中,由于区间范围限制,性能不是主要瓶颈,但我仍然尽量优化了代码,使其尽可能简洁高效。
通过这次练习,我不仅巩固了字符串处理和集合操作的知识,还学会了如何更有效地设计算法来解决问题。每一次成功的解决都给我带来了极大的满足感,也让我更加热爱编程这项活动。我相信,通过不断的学习和实践,我可以在编程这条路上走得更远。
遇到的挑战
-
字符串转换:最初,我尝试直接通过数字运算来判断一个整数是否为完美整数,但这导致代码变得复杂且难以维护。后来,我发现将整数转换为字符串并使用集合来判断更为简洁和高效。
-
性能优化:虽然给定的区间范围相对较小,但为了提高代码的通用性,我还是尽量减少了不必要的计算。例如,使用集合来判断字符串中字符的唯一性,而不是手动比较每个字符。
-
边界条件:处理区间边界条件时,我注意到区间
[x, y]是闭区间,即包括端点x和y。因此,在遍历时需要确保区间[x, y + 1)被正确遍历。
成功的喜悦
每次成功解决一个问题后,我都会感到一种难以言喻的喜悦和成就感。这种感觉不仅来自于代码的正确运行,更来自于自己通过思考和努力找到了解决问题的方法。在编写 is_perfect_number() 函数时,当我第一次看到它能够正确判断一个整数是否为完美整数时,那种兴奋的感觉至今记忆犹新。
时间复杂度分析
初始化:初始化 values 和 operators 栈的时间复杂度为 O(1)。
数据处理:遍历输入的表达式,时间复杂度为 O(n),其中 n 是区间 [x, y] 的长度。
查找和更新:在遍历过程中,处理每个整数的时间复杂度为 O(1)。
结果提取:提取最终结果的时间复杂度为 O(1)。
总体时间复杂度为 O(n),其中 n 是区间 [x, y] 的长度。
空间复杂度分析
栈:存储数值和运算符的空间复杂度为 O(1),因为我们没有使用额外的栈。
结果列表:存储最终结果的空间复杂度为 O(1)。
总体空间复杂度为 O(1)。