在编程和技术学习的道路上,刷题是一项不可或缺的任务。尤其是对于那些希望在算法和数据结构方面不断提升自己的人来说,刷题不仅仅是为了完成任务,更是为了深入理解问题的本质、提升问题解决能力。在参加第五天青训营与豆包MarsCode技术训练营的过程中,我深刻体会到了刷题的真正意义,并通过几个具体的算法题目,反思和总结了自己的一些学习心得与方法。
1. 刷题的目的与意义
首先,我们要明确刷题的核心目的并非单纯为了积累数量,而是通过每一道题的练习,强化自己的逻辑思维能力、算法设计能力以及编程实践能力。刷题过程中,我渐渐发现,许多题目不仅考察我们的编码能力,更重要的是考察我们如何拆解问题、选择合适的算法、优化代码的思路。在这条学习路上,刷题是一种持续提升的过程,它要求我们具备自我反思和不断优化的习惯。
2. 刷题的常见误区
在初学者的阶段,我们往往会陷入以下几个误区:
- 只关注解决方法:不少同学在刷题时,容易忽视问题的背景和解法的设计过程,只着眼于最后的结果。这种方法虽然能够快速获得通过的答案,但并不利于深入理解算法的原理和应用。
- 盲目追求数量:有些人可能会设定一个目标,比如一天刷完10道题,或者每周完成一定数量的题目,结果反而忽视了每一道题目的深度分析和复盘。盲目追求数量会让我们忽略掉每道题中需要思考的细节,导致学习效果不佳。
为此,我认为正确的刷题方式应该是质量优先,在做题时要注重思考每一步操作的动机、方法与背后的思想,而不是一味追求数量。
3. 具体的题目分析
在这次训练营中,我们主要做了几个典型的算法题目,这些题目不仅考察了我们对常见算法的掌握,还帮助我们提升了解决问题的系统性思维。
题目一:数组的两数之和
这个题目要求我们从一个数组中找到两个数,使得它们的和等于给定的目标值。这是一个经典的算法题,适合用来练习哈希表的应用。对于这种题目,首先要理解其暴力解法——双重循环来检查每一对数。这种方法的时间复杂度是O(n^2),显然效率较低。因此,我决定尝试通过哈希表优化,哈希表能够在O(1)的时间复杂度内进行查找,整个问题的时间复杂度可以降低到O(n)。
我的思路是:遍历数组,对于每个数,判断目标值减去当前数是否存在于哈希表中。如果存在,说明找到了两数之和为目标值的解。如果不存在,则将当前数添加到哈希表中。通过这种方法,我们可以在一次遍历中找到解,时间复杂度优化到了O(n),空间复杂度是O(n)。
pythonCopy Code
def twoSum(nums, target):
hashmap = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hashmap:
return [hashmap[complement], i]
hashmap[num] = i
通过这个问题,我认识到哈希表是处理查找问题的高效工具,能够将时间复杂度大幅降低。这种优化不仅提升了我的算法设计能力,还让我更加深入地理解了数据结构的作用和选择。
题目二:最长回文子串
另一个挑战性的题目是“最长回文子串”,要求在给定的字符串中找到最长的回文子串。对于这种题目,暴力解法是枚举所有子串并判断是否为回文,但这种方法的时间复杂度为O(n^3),效率显然不高。于是,我开始考虑如何优化这一过程。
我的思路是利用中心扩展法。一个回文串的特点是,它的左右两边是对称的。因此,可以选择每个字符作为回文的中心,尝试向两边扩展来判断回文串的最大长度。这种方法的时间复杂度为O(n^2),相比暴力解法有所提高。为了进一步优化,可以使用动态规划来减少重复计算,但对于这种题目,我认为中心扩展法是更直观且高效的解决方法。
pythonCopy Code
def longestPalindrome(s):
def expand_around_center(left, right):
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return right - left - 1
if len(s) < 1:
return ""
start, end = 0, 0
for i in range(len(s)):
len1 = expand_around_center(i, i)
len2 = expand_around_center(i, i + 1)
max_len = max(len1, len2)
if max_len > (end - start):
start = i - (max_len - 1) // 2
end = i + max_len // 2
return s[start:end+1]
这道题让我意识到回文问题的多种解法和优化路径,同时也提高了我对时间复杂度和空间复杂度的敏感度。在解题过程中,思考如何在保证正确性的同时提高算法效率,是非常关键的。
4. 总结与反思
通过这次青训营与豆包MarsCode技术训练营的刷题过程,我不仅提升了自己的编程能力,也进一步理解了算法的本质和应用。每一道题目背后不仅有解决问题的技巧,更有思维方式的训练。刷题不应仅仅是“做题”,更应该是一个“思考”过程。只有在不断的练习和反思中,才能真正掌握问题解决的技巧,并逐渐形成自己的解题框架和思维方式。
未来,我将更加注重每一道题的思考过程,而不仅仅满足于题目的解决方案。同时,也会定期复盘已做过的题目,探索优化空间,真正做到“以练促学,学以致用”。