好资源和短想法
关于刷题
网络上的刷题指南太多了,重点还是刷得多、不如刷得有效率。 以下的三点对我来说受用超级大(谢谢 Pu-Chin 呜呜),希望大家能在刷题之余多花点心思做这些。
建立一个 Google Spreadsheet,把写过的题目整理起来,下次复习时试着只看自己的笔记,不看写过的 code 重新做一次。 每次写完一题就加一笔 entry 进去。 共分为 10 个 columns:
Tag,#,名字,URL,Technique,核心概念簡述,延伸題,時間複雜度,空間複雜度,完成日期
2. 按照 Tag 去刷题,每次写完一题通常 Leetcode 会推荐你一些延伸题,就把他一次做完。
3. 写一个 Markdown 笔记,把模板整理好,模板就是题型跟技巧做总结,类似这样的东东:
### BFS
Q = []
Q.append(S)
visit = set([])
level = 0
while len(Q) > 0:
cnt = len(Q)
while cnt > 0:
cnt -= 1
top = Q[0]
visit.add(top)
del Q[0]
for nei in neighbors[top]:
if nei in visit:
continue
Q.append(nei)
level += 1
### QuickSort
def partition(self, nums, l, r) -> int:
pi = random.randint(l, r)
nums[l], nums[pi] = nums[pi], nums[l]
p = nums[l]
while l < r:
while l < r and p <= nums[r]:
r -= 1
nums[l] = nums[r]
while l < r and p >= nums[l]:
l += 1
nums[r] = nums[l]
nums[l] = p
return l
def quickSort(self, nums, l, r) -> int:
N = len(nums)
if l < r:
pi = self.partition(nums, l, r)
self.quickSort(nums, l, pi - 1)
self.quickSort(nums, pi + 1, r)
return nums
### Inorder Traversal
def inorderTraversal(self, root: TreeNode) -> List[int]:
if root == None:
return []
st = []
ans = []
while len(st) > 0 or root != None:
if root != None:
st.append(root)
root = root.left
else:
root = st[-1]
st.pop()
ans.append(root.val)
root = root.right
return ans
### ...
整个档案超级长,各种模版都在里面。 写这一堆模板的目的在于,当你在面试时通常只有 60 min 要完成两题,而最要不得的就是明明知道是 QuickSort 但你忘记他的架构长怎样。 如果是想不到解法就算了,明明知道解法却实作不出来、这种才是最难过的。 因此先完成一份又一份的基本型模板,然后按照 tag 练习,就能让你对模板掌握度越来越好。
网络上的刷题指南太多了,重点还是刷得多、不如刷得有效率。 以下的三点对我来说受用超级大(谢谢 Pu-Chin 呜呜),希望大家能在刷题之余多花点心思做这些。
建立一个 Google Spreadsheet,把写过的题目整理起来,下次复习时试着只看自己的笔记,不看写过的 code 重新做一次。 每次写完一题就加一笔 entry 进去。 共分为 10 个 columns:
Tag,#,名字,URL,Technique,核心概念簡述,延伸題,時間複雜度,空間複雜度,完成日期
2. 按照 Tag 去刷题,每次写完一题通常 Leetcode 会推荐你一些延伸题,就把他一次做完。
3. 写一个 Markdown 笔记,把模板整理好,模板就是题型跟技巧做总结,类似这样的东东:
### BFS
Q = []
Q.append(S)
visit = set([])
level = 0
while len(Q) > 0:
cnt = len(Q)
while cnt > 0:
cnt -= 1
top = Q[0]
visit.add(top)
del Q[0]
for nei in neighbors[top]:
if nei in visit:
continue
Q.append(nei)
level += 1
### QuickSort
def partition(self, nums, l, r) -> int:
pi = random.randint(l, r)
nums[l], nums[pi] = nums[pi], nums[l]
p = nums[l]
while l < r:
while l < r and p <= nums[r]:
r -= 1
nums[l] = nums[r]
while l < r and p >= nums[l]:
l += 1
nums[r] = nums[l]
nums[l] = p
return l
def quickSort(self, nums, l, r) -> int:
N = len(nums)
if l < r:
pi = self.partition(nums, l, r)
self.quickSort(nums, l, pi - 1)
self.quickSort(nums, pi + 1, r)
return nums
### Inorder Traversal
def inorderTraversal(self, root: TreeNode) -> List[int]:
if root == None:
return []
st = []
ans = []
while len(st) > 0 or root != None:
if root != None:
st.append(root)
root = root.left
else:
root = st[-1]
st.pop()
ans.append(root.val)
root = root.right
return ans
### ...
整个档案超级长,各种模版都在里面。 写这一堆模板的目的在于,当你在面试时通常只有 60 min 要完成两题,而最要不得的就是明明知道是 QuickSort 但你忘记他的架构长怎样。 如果是想不到解法就算了,明明知道解法却实作不出来、这种才是最难过的。 因此先完成一份又一份的基本型模板,然后按照 tag 练习,就能让你对模板掌握度越来越好。
结合Bear来谈谈怎样用笔记建立自己的知识图谱(使用标签和链接功能) UP主: Arya_Yang http://www.bilibili.com/video/BV1xt4y1y73Z?share_medium=android&share_source=more&bbid=XYC3D6DC9F7C9885230C87993C7DBB2E59113&ts=1591612430251
这个方法我觉得是很不错的,PPT是最后一步,最重要的是前期如何准备素材和大纲结构,文中的顺序也没毛病,可以长期学习其中的模式,再结合自己的方式整合一下
常见的的一些可扩展性方法,包括设计模式、模块化机制、Java SPI 机制以及 Callback 机制。
在了解了 Dubbo 和 Mybatis 这两个框架的包结构之后,我们再从前文中“为什么这个框架的代码结构要这么设计?”这个问题出发可以延伸出以下问题:
这些框架的开发人员是如何设计和规划这些代码结构的?
这些代码结构的背后是否遵循了一定的原则?
如何评价这些代码结构的优劣性?
如何从这些框架的代码结构中获取经验从而可以学以致用?
源码阅读需要有突破点,本课程会引导大家逐步挖掘这些突破点。而对以上问题的发散和总结就是我们进行源码解读的一个突破点。想要理解代码结构,我们还是需要从一些基本原理入手,这就是接下去将要介绍组件设计原则。
这些框架的开发人员是如何设计和规划这些代码结构的?
这些代码结构的背后是否遵循了一定的原则?
如何评价这些代码结构的优劣性?
如何从这些框架的代码结构中获取经验从而可以学以致用?
源码阅读需要有突破点,本课程会引导大家逐步挖掘这些突破点。而对以上问题的发散和总结就是我们进行源码解读的一个突破点。想要理解代码结构,我们还是需要从一些基本原理入手,这就是接下去将要介绍组件设计原则。