青训营X豆包MarsCode 技术训练营刷题分享 | 豆包MarsCode AI 刷题

46 阅读5分钟

今天想写一个心得总结,昨天晚上开了直播班会,又收获了很多关于实习、面试等等职场相关的知识,感激不尽,但是更想写一个今天刷的题目的分析来让我的想法能清晰有逻辑些

完美整数计数器的心路历程

在最近的一次编程练习中,我遇到了一个既有趣又具有挑战性的问题:计算给定区间 [x, y] 中有多少个整数是完美整数。所谓完美整数,是指由相同数字组成的整数,比如 11333 等。这不仅是一个数学上的趣味问题,也是一个很好的编程练习,它让我有机会深入思考如何高效地处理字符串和数字的关系,以及如何优化循环和条件判断。

 算法设计

为了解决这个问题,我首先定义了一个辅助函数 is_perfect_number(n),用于判断一个整数是否为完美整数。这个函数的基本思路是将整数转换成字符串形式,然后检查字符串中所有字符是否相同。如果字符串中字符的集合大小为1,说明这个整数是由同一个数字重复组成,因此它是完美整数。

接着,我实现了主函数 solution(x, y),它的目的是计算区间 [x, y] 内有多少个完美整数。这个函数通过遍历给定区间内的每一个整数,并调用 is_perfect_number() 函数来判断该整数是否为完美整数。如果是,则增加计数器 count 的值。

 实现步骤

  1. 定义辅助函数:创建 is_perfect_number(n) 函数,该函数接收一个整数作为参数,将其转换为字符串,然后通过集合的特性来判断字符串中是否有超过一种不同的字符。如果有且仅有一种字符,则该整数为完美整数。

def is_perfect_number(n):

"""判断一个整数是否为完美整数"""

str_n = str(n)

return len(set(str_n)) == 1

  1. 主函数实现:创建 solution(x, y) 函数,该函数遍历从 xy 区间内的每一个整数,使用 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

  1. 返回结果:遍历完成后,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

 心路历程

在解决这个问题的过程中,我遇到了一些挑战。最初,我对如何高效地判断一个整数是否为完美整数感到有些棘手。但是,通过将整数转换为字符串并利用集合的特性,我找到了一个简洁而有效的方法来解决这个问题。此外,我还考虑了性能问题,特别是在处理大区间时,如何减少不必要的计算。虽然在这个特定的问题中,由于区间范围限制,性能不是主要瓶颈,但我仍然尽量优化了代码,使其尽可能简洁高效。

通过这次练习,我不仅巩固了字符串处理和集合操作的知识,还学会了如何更有效地设计算法来解决问题。每一次成功的解决都给我带来了极大的满足感,也让我更加热爱编程这项活动。我相信,通过不断的学习和实践,我可以在编程这条路上走得更远。

 遇到的挑战

  1. 字符串转换:最初,我尝试直接通过数字运算来判断一个整数是否为完美整数,但这导致代码变得复杂且难以维护。后来,我发现将整数转换为字符串并使用集合来判断更为简洁和高效。

  2. 性能优化:虽然给定的区间范围相对较小,但为了提高代码的通用性,我还是尽量减少了不必要的计算。例如,使用集合来判断字符串中字符的唯一性,而不是手动比较每个字符。

  3. 边界条件:处理区间边界条件时,我注意到区间 [x, y] 是闭区间,即包括端点 xy。因此,在遍历时需要确保区间 [x, y + 1) 被正确遍历。

 成功的喜悦

每次成功解决一个问题后,我都会感到一种难以言喻的喜悦和成就感。这种感觉不仅来自于代码的正确运行,更来自于自己通过思考和努力找到了解决问题的方法。在编写 is_perfect_number() 函数时,当我第一次看到它能够正确判断一个整数是否为完美整数时,那种兴奋的感觉至今记忆犹新。

 时间复杂度分析

初始化:初始化 valuesoperators 栈的时间复杂度为 O(1)。 数据处理:遍历输入的表达式,时间复杂度为 O(n),其中 n 是区间 [x, y] 的长度。 查找和更新:在遍历过程中,处理每个整数的时间复杂度为 O(1)。 结果提取:提取最终结果的时间复杂度为 O(1)。 总体时间复杂度为 O(n),其中 n 是区间 [x, y] 的长度。

 空间复杂度分析

栈:存储数值和运算符的空间复杂度为 O(1),因为我们没有使用额外的栈。

结果列表:存储最终结果的空间复杂度为 O(1)。

总体空间复杂度为 O(1)。