[摘要]程序员是怎么学习算法的?其实你我都心知肚明,除非特殊场景,在中国的 IT 环境里,大多数场景下,学习算法的目的在于通过笔试算法题。但算法书林林总总,有时候乱花渐...
程序员是怎么学习算法的?
其实你我都心知肚明,除非特殊场景,在中国的 IT 环境里,大多数场景下,学习算法的目的在于通过笔试算法题。
但算法书林林总总,有时候乱花渐欲迷人眼。
杜甫有诗云:读书破万卷,下笔如有神。不管选择哪本书,只要深入学习,分层次,逐层进阶,一定可以将算法攻克。
笔者强烈推荐一个 Github 开源项目 LeetCode-Go,你不仅可以把他当做一本开源算法书,也可以当做一个学习和交流的平台。
1 项目简介

github 地址:https://github.com/halfrost/LeetCode-Go
作者写算法书的目的很利他:
刷题刷了一年了,想和大家分享分享一些做题心得,解题方法。想和有相同爱好的人交个朋友,一起交流学习。对于自己来说,写题解也是一种提高。把一道深奥的题目讲给一点都没有头绪的人,并能让他完全听懂,很能锻炼人的表达能力。在讲解中很可能还会遇到听者的一些提问,这些问题可能是自己的知识漏洞,强迫自己去弥补。笔者在公司做过相关的分享,感受很深,双方受益都还不错。
2 便于阅读


离线版本的电子书《LeetCode Cookbook》PDF Download here

通过 iOS / Android 浏览器安装 PWA 版《LeetCode Cookbook》至设备桌面随时学习



3 图书目录

为了让读者一步步学习,作者将图书分为四个部分:
1、序章:算法的基础知识(数据结构知识 & 算法知识 & 时间复杂度)

2、算法专题

3、一些模版

4、LeetCode 题解

程序员是怎么学习算法的?
把自己变笨,要进入计算机的世界,每次只能进行一步计算。最难的算法都是需要迭代理解,比如链表逆转,如果空间足够大,可以把所有链条断开并且都保存起来,用递归:头部的指针直接给临时指针,临时指针变头部指针继续循环,直到找到尾部的指针,然后头尾交换,完成转换。
public Node reverseList(Node node) {
if(node.next == null) {//当最后一个节点的时候返回return node;
}
Node temp = node.next;//得到当前节点的下一个节点
Node returnNode = reverseList(temp);
temp.next = node;//下一个节点的下一个节点为当前节点实现逆转
node.next = null;//实现逆转前链表的头结点为为节点
return returnNode;//返回逆转后的链表的头节点
}
如果没有大空间,就需要头指针自己迭代,保存头部的指针,头部的指针变头头部指针(第一次为尾部空),头头部指针变头指针,头指针变头部指针,这一轮结束,下轮开始,直到末尾。
public Node reverseList2(Node node) {
Node frontNode = null;//头结点逆转的时候前一个节点为null
Node headNode = node;//当前节点为头节点
Node tempNode;//临时变量保存下一个节点while(headNode != null) {
tempNode = headNode.next;
headNode.next = frontNode;//实现逆转
frontNode = headNode;
headNode = tempNode;
}
return frontNode;
}