前言
青训营刷题页面右侧内置了豆包MarsCode AI。相比于传统的题目页面,Marscode的引入不仅迎合了当今空前的AI热潮,也为我们编写算法提供了许多便利。本文将以“贪心猫的鱼干大分配”为例,真实展示刷题页面内置AI的使用体验,文末也会进行总结与建议。
贪心猫的鱼干大分配
问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
测试样例
样例1:
输入:
n = 3, cats_levels = [1, 2, 2]
输出:4
样例2:
输入:
n = 6, cats_levels = [6, 5, 4, 3, 2, 16]
输出:17
样例3:
输入:
n = 20, cats_levels = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
输出:35
题目解答
思路分析
这道题理解起来比较容易,我的想法是构造两次循环,先从左到右检查每只猫与左侧那只的等级差异进行分配,然后再从右到左检查每只猫与右侧的等级,两次循环确保按照题目要求成功分配
Python代码
def solution(n, cats_levels):
fish_amounts = [1] * n
for i in range(1, n):
if cats_levels[i] > cats_levels[i - 1]:
fish_amounts[i] = fish_amounts[i - 1] + 1
for i in range(n - 2, -1, -1):
if cats_levels[i] > cats_levels[i + 1]:
fish_amounts[i] = max(fish_amounts[i], fish_amounts[i + 1] + 1)
return sum(fish_amounts)
if __name__ == "__main__":
# You can add more test cases here
cats_levels1 = [1, 2, 2]
cats_levels2 = [6, 5, 4, 3, 2, 16]
cats_levels3 = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
print(solution(3, cats_levels1) == 4)
print(solution(6, cats_levels2) == 17)
print(solution(20, cats_levels3) == 35)
Marscode AI辅助
写完这段代码后,我将代码讲给豆包AI进行检查,以下她的回复:
当然可以帮你检查代码。以下是对你代码的检查和建议:
代码检查
-
逻辑正确性:
- 你的代码逻辑是先从左到右遍历,确保每只猫的鱼干数满足其等级高于左边相邻猫的情况。
- 然后从右到左遍历,确保每只猫的鱼干数满足其等级高于右边相邻猫的情况。
- 这个逻辑是正确的,能够满足题目要求。
-
边界条件:
- 代码中已经考虑了边界条件,即
n = 1的情况,因为fish_amounts初始化为[1] * n,所以即使n = 1,也能正确处理。
- 代码中已经考虑了边界条件,即
-
代码风格:
- 代码风格良好,注释清晰,变量命名合理。
代码优化建议
-
减少重复计算:
- 在第二个
for循环中,fish_amounts[i] = max(fish_amounts[i], fish_amounts[i + 1] + 1)这行代码可能会导致一些不必要的重复计算。虽然这不会影响最终结果,但可以考虑优化。
- 在第二个
-
测试用例:
- 你已经添加了多个测试用例,这很好。确保测试用例覆盖了各种边界情况和常规情况。
从回复中可以看到,豆包详细分析了我的算法思路,总结了三处优点;同时她也指出了优化建议,具体到某一行是否必要。在分析已完成的代码这方面,豆包的发挥比较稳定。
紧接着我又询问豆包是否有更好的算法,她提供了一个代码片段(就不放进文章了),同时讲解了其中的思路。不过就如市面上大多数AI一样,豆包的代码大体实现了题目要求,但在处理边界条件时有所疏忽,需要手动补充。不过这一点可以通过追问的方式解决。
总结
相比于传统的刷题页面,豆包AI的引入无疑降低了用户debug的负担,尤其在出现低级错误时,AI能够更快发现并纠正,大大提高了编程的效率。然而,在创作代码这一点上,AI仍可以进一步提升,灵活性和边界条件的考虑需要更加重视。