稀土掘金 × 青训营 × 豆包MarsCode
NEWS
青训营宣传语
如果有人对前端/后端/AI 技术以及字节感兴趣并想系统学习来自大厂课程的话,可以试试青训营!
青训营是字节跳动稀土掘金社区发起的技术系列培训 & 人才选拔项目,旨在培养优秀且具有职业竞争力的开发工程师。
课程全程免费,不收取任何费用!
考核方式:通过发布的刷题任务即可获得入营资格
技术方向仅限报名一个!
入营后课程查看权限:前后端课程对所有同学开放,AI 方向课程仅报名入营 AI 方向的同学可看
关于青训营
青训营是字节跳动技术团队发起的技术系列培训&人才选拔项目;面向高校在校生,旨在培养优秀且具有职业竞争
力的开发工程师。
本次技术训练营由掘金联合豆包MarsCode团队主办,课程包含前端、后端和AI方向,在这个飞速发展的AI时
代,我们将和豆包MarsCode一起深入探索,在青训营的技术氛围中,学习AI,使用AI,高效写码~
亮点
学习时间自由,入营期间可自由观看&复习课程
AI 练中学:完整的学习使用场景,体验AI课程边学边练
除前端、后端和AI课程外,大数据、客户端等大量字节内部课程补充学习
你将获得
1.学习经历
友好、实用的新手课程,收获一份珍贵难忘的学习经历
2.大咖讲师
大咖多年coding经验倾心分享,技能突飞猛进,技术视野打开
3.社区交流
拓展技术圈,与志同道合的同学在掘金社区互动学习
4.专属社群
专属技术方向课程群,不定期直播解惑答疑,丰富的学习资源与浓厚的技术氛围
5.结营证书
完成学习可获得专属的结营证书,见证你的突破和成长
入营条件
高校在校生,热爱前端/后端/AI技术并热切提升自己的技术能力
有一定计算机基础知识,报名后参与刷题活动,全程参与学习
每人仅限报名一个技术方向,入营后可学习多个方向课程
课程内容
算法参考资料看我的博客
Data_structure&Algorithms&日常算法练习docs
掘金AI刷题
数字分组求偶数和
step1 理解递归的基本概念
递归是一种函数调用自身的技术。递归函数通常包含两个部分:
基线条件(Base Case):递归终止的条件,避免无限递归。
递归条件(Recursive Case):函数调用自身的部分,通常通过缩小问题的规模来逐步接近基线条件。
step2 掌握递归的思维方式
递归的思维方式是将一个大问题分解成一个或多个相同类型的子问题,直到子问题足够简单可以直接解决。递归的核心思想是“分而治之”。
step3 通过实例理解递归
通过一些经典的递归问题来理解递归的工作原理:
阶乘:计算 n!,可以通过递归定义为 n * (n-1)!。
斐波那契数列:计算第 n 个斐波那契数,可以通过递归定义为 F(n) = F(n-1) + F(n-2)。
二叉树遍历:前序、中序、后序遍历二叉树,可以通过递归实现。
step4 练习递归问题
通过大量的练习来熟悉递归的应用。以下是一些常见的递归问题:
字符串反转:递归反转字符串。
组合生成:生成所有可能的组合。
排列生成:生成所有可能的排列。
汉诺塔问题:经典的递归问题,移动盘子。
step5 分析递归的时间和空间复杂度
理解递归的时间和空间复杂度,避免不必要的递归调用。递归的时间复杂度通常与递归树的深度和宽度有关,空间复杂度与递归调用的栈深度有关。
step6 优化递归
递归有时会导致重复计算,可以通过记忆化(Memoization)或动态规划(Dynamic Programming)来优化递归。
示例代码:阶乘
def factorial(n):
# 基线条件
if n == 0:
return 1
# 递归条件
else:
return n * factorial(n - 1)
# 测试
print(factorial(5)) # 输出 120
示例代码:斐波那契数列
def fibonacci(n):
# 基线条件
if n <= 1:
return n
# 递归条件
else:
return fibonacci(n - 1) + fibonacci(n - 2)
# 测试
print(fibonacci(6)) # 输出 8
奇妙货币交易问题 2024-11-10
Q:如何读题
1. 仔细阅读题目描述
理解题意:首先,通读题目描述,确保你理解了问题的背景和要求。题目描述通常会包含问题的背景、输入输出格式、以及一些测试样例。
关键词提取:注意题目中的关键词,例如“最多两次”、“货币面值”、“交易成功”等。这些关键词通常是解题的关键点。
2. 分析输入输出
输入格式:题目通常会告诉你输入的格式和范围。例如,本题的输入是两个整数 ( V ) 和 ( W )。
输出格式:题目会告诉你输出的格式和要求。例如,本题要求输出 'YES' 或 'NO'。
3. 理解测试样例
测试样例:题目通常会提供一些测试样例,帮助你理解题意。仔细分析这些样例,尝试手动推导出结果,看看是否符合题目的要求。
边界情况:注意测试样例中的边界情况,例如最小值、最大值、特殊值等。这些情况通常是解题时需要特别注意的地方。
4. 分解问题
问题分解:将问题分解成更小的子问题。例如,本题可以分解为如何用给定的货币面值组合出特定的金额 ( W ),并且每种面值最多使用两次。
子问题关联:分析子问题之间的关联,看看是否可以用动态规划、贪心算法、递归等方法来解决。
5. 选择合适的算法和数据结构
算法选择:根据问题的特点选择合适的算法。例如,本题由于涉及到组合问题和重叠子问题,动态规划是一个合适的选择。
数据结构选择:选择合适的数据结构来存储和处理数据。例如,本题可以使用布尔数组 dp 来存储中间结果。
6. 验证思路
手动验证:在开始编写代码之前,手动验证你的思路是否正确。可以通过手动推导一些简单的样例来验证。
伪代码:如果思路正确,可以先写一些伪代码,帮助你理清思路。
eg.
题目描述:
- 小R住在一个名为 X 国的国家,这里的货币非常特殊,面值为 ( V^0, V^1, V^2,..., V^n ),并且 ( n ) 可以无限大。该国的交易规则也很特别:在一次交易中,双方只能对每种面值的货币使用不超过两次。
- 你需要判断是否能按照规则用给定的货币面值 ( V ) 来完成价格为 ( W ) 的交易。
输入输出:
- 输入:两个整数 ( V ) 和 ( W )。
- 输出:字符串 'YES' 或 'NO'。
测试样例:
- 样例1:V = 10, W = 9,输出 'YES'。
- 样例2:V = 200, W = 40199,输出 'YES'。
- 样例3:V = 108, W = 50,输出 'NO'。
分解问题:
- 是否可以用 ( V^0, V^1, V^2, \ldots ) 这些面值的货币来完成价格为 ( W ) 的交易。
- 每种面值的货币最多只能使用两次。
选择算法和数据结构:
- 由于涉及到组合问题和重叠子问题,动态规划是一个合适的选择。
- 使用布尔数组 dp 来存储中间结果。
验证思路:
- 手动验证一些简单的样例,例如 ( V = 10, W = 9 ),看看是否能得到正确的结果。
破题,AI做不对,我也不会,遗憾立场,下一道
翻转增益的最大子数组和 2024-11-10
妈的,AI终于做对了,每天来看看这道题咋做的,反正不会写,先贴上再说
问题理解
题目要求我们找到在翻转数组中的任意子数组后,能够得到的最大子数组和。子数组是数组中的一个连续部分。
解题思路
不翻转的情况:首先我们可以计算出原数组的最大子数组和,这可以通过经典的Kadane算法来实现。
翻转的情况:我们需要考虑翻转任意子数组后,可能得到的最大子数组和。翻转一个子数组可能会改变数组的局部结构,从而影响最大子数组的计算。
关键点
Kadane算法:用于计算不翻转情况下的最大子数组和。
翻转的影响:翻转一个子数组可能会将负数变为正数,或者将正数变为负数,从而改变子数组的和。
算法步骤
计算原数组的最大子数组和:使用Kadane算法。
考虑翻转的影响:
翻转一个子数组 [i, j] 后,原数组变为 A[:i] + reversed(A[i:j+1]) + A[j+1:]。
计算翻转后每个可能子数组的最大子数组和。
综合考虑:比较不翻转和翻转后的最大子数组和,取最大值。