实践记录以及工具使用
刷题实践选题
题目名称:连续子数组零尾数问题
题目来源:豆包MarsCode AI刷题平台
题目描述: 给定一个整数数组 a 和一个整数 x,计算乘积末尾零的数量大于等于 x 的连续子数组的数量。由于答案可能非常大,结果需要对 10^9 + 7 取模。
刷题实践记录:
-
选择题目:
- 选择这道题目是因为它涉及到多个算法知识点,如前缀和、滑动窗口等,能够综合提升我的算法能力。
-
初步尝试:
-
初始思路是使用两层嵌套循环来遍历所有可能的子数组,计算每个子数组的因子
2和5的数量,但这会导致时间复杂度过高。 -
代码实现如下:
python def solution(a: list, x: int) -> int: MOD = 10**9 + 7 n = len(a) # 计算每个元素的因子 2 和 5 的数量 factors_2 = [count_factors(num, 2) for num in a] factors_5 = [count_factors(num, 5) for num in a] # 初始化结果 result = 0 # 滑动窗口 for left in range(n): for right in range(left, n): count_2 = sum(factors_2[left:right+1]) count_5 = sum(factors_5[left:right+1]) if min(count_2, count_5) >= x: result = (result + 1) % MOD return result
-
-
问题发现:
- 初始代码的时间复杂度为 O(n^2),无法在合理时间内处理大规模数据。
- 需要优化时间复杂度,减少不必要的重复计算。
-
优化方案:
-
使用前缀和数组来快速计算任意子数组的因子
2和5的总和。 -
使用双指针技术,减少不必要的重复计算。
-
优化后的代码如下:
-
def count_factors(num, factor):
count = 0
while num % factor == 0:
count += 1
num //= factor
return count
def solution(a: list, x: int) -> int:
MOD = 10**9 + 7
n = len(a)
# 计算每个元素的因子 2 和 5 的数量
factors_2 = [count_factors(num, 2) for num in a]
factors_5 = [count_factors(num, 5) for num in a]
# 计算前缀和
prefix_2 = [0] * (n + 1)
prefix_5 = [0] * (n + 1)
for i in range(n):
prefix_2[i + 1] = prefix_2[i] + factors_2[i]
prefix_5[i + 1] = prefix_5[i] + factors_5[i]
# 初始化结果
result = 0
# 滑动窗口
for left in range(n):
for right in range(left, n):
count_2 = prefix_2[right + 1] - prefix_2[left]
count_5 = prefix_5[right + 1] - prefix_5[left]
if min(count_2, count_5) >= x:
result = (result + 1) % MOD
return result
if __name__ == '__main__':
# 测试用例
print(solution(a=[5, 2, 3, 50, 4], x=2) == 6)
print(solution(a=[10, 5, 2, 1], x=3) == 0)
print(solution(a=[25, 4, 8], x=1) == 2)
-
测试与调试:
-
使用豆包MarsCode AI刷题平台提供的测试用例进行测试,确保代码的正确性。
-
测试用例如下:
python if __name__ == '__main__': # 测试用例 print(solution(a=[5, 2, 3, 50, 4], x=2) == 6) print(solution(a=[10, 5, 2, 1], x=3) == 0) print(solution(a=[25, 4, 8], x=1) == 2)
-
-
总结与反思:
- 通过这道题目,我学会了如何使用前缀和和滑动窗口技术来优化时间复杂度。
- 也意识到了在处理大规模数据时,优化算法的重要性。
- 今后在遇到类似问题时,会优先考虑使用前缀和和滑动窗口等高效算法。
优势分析
-
个性化题目推荐:
- 优势:大量的练习题,根据划分了难度区间的题目,确保用户在合适的难度区间内进行练习。 在刷题过程中,我在豆包MarsCode AI刷题平台找到了“连续子数组零尾数问题”。这道题目正好是我需要提升的算法知识点之一,通过这道题目的练习,我不仅巩固了前缀和和滑动窗口的知识,还学会了如何优化时间复杂度。
-
详细解题解析:
- 优势:每道题目都提供详细的解题解析,包括思路分析、代码实现和常见错误提示,帮助用户理解错误原因,提升解题能力。 在解决“连续子数组零尾数问题”时,我最初使用了两层嵌套循环,导致时间复杂度过高。通过平台提供的解题解析,我了解到了前缀和和滑动窗口技术,优化了代码,最终通过了所有测试用例。
-
云端编辑器:
- 优势:提供强大的云端编辑器,支持多种编程语言,用户可以在任何设备上进行编程练习,无需安装额外的开发环境。 在解决“连续子数组零尾数问题”时,我使用了平台提供的云端编辑器。编辑器的语法高亮、自动补全和实时运行功能,极大地提高了我的编码效率。此外,云存储功能让我可以在不同的设备上继续未完成的练习,非常方便。
-
实时反馈与评估:
- 优势:平台提供实时的代码运行结果和性能评估,帮助用户及时发现和纠正错误。 在提交“连续子数组零尾数问题”的代码时,平台立即给出了运行结果和性能评估。通过这些反馈,我发现了代码中的性能瓶颈,并进行了优化。这种即时反馈机制极大地提高了我的学习效率。
通过使用豆包MarsCode AI功能,我在刷题过程中更加高效,也更有针对性地提升了我的算法能力。希望这些经验能帮助其他用户更好地利用平台资源,提升自己的编程水平。祝大家刷题愉快,进步飞速!