网友:新虎城

回答时间:06月20日

程序员学习算法时,建议先从以下几个方面开始:

1. 基础算法学习:学习算法基础知识,如排序、查找、哈希、树、图等基本算法。可以通过看相关书籍和视频,参加相关课程和学习群,或者参考网上的相关博客或论文进行学习和实践。

2. 练习算法实现:学习一个算法后,应该通过编写代码来实现和练习这个算法。可以在LeetCode、洛谷、CodeForces等OJ平台上练习算法实现。

3. 多思考和交流:练习算法的过程中,遇到问题应该及时记录问题、思考答案并与他人交流,以便更好地理解和掌握算法。

4. 刷题和做题:刷题是学习算法中的重要方式,可以在OJ平台找到大量的题目进行练习,提升算法实现能力和效率。

5. 参加比赛:加入编程比赛和算法竞赛,可以提供更好的学习和交流环境,进一步加深对算法的理解和掌握。常见的比赛包括ACM/ICPC、Google Code Jam等。

总之,学习算法需要有耐心、细心,需要多加练习和思考,遇到问题应该及时与他人交流和讨论。不断地学习和提高自己的能力,才能更好地应对未来的编程工作和挑战。

网友:胖子随感

回答时间:2020年08月01日

把自己变笨,要进入计算机的世界,每次只能进行一步计算。最难的算法都是需要迭代理解,比如链表逆转,如果空间足够大,可以把所有链条断开并且都保存起来,用递归:头部的指针直接给临时指针,临时指针变头部指针继续循环,直到找到尾部的指针,然后头尾交换,完成转换。

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;

}

网友:勇哥java实战分享

回答时间:04月20日

其实你我都心知肚明,除非特殊场景,在中国的 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 题解

网友:天涯学馆

回答时间:2020年07月07日

首先基础知识要牢固

基础知识包括数学基础,计算机基础;数学基础研究生以前的数学都是基础数学,严谨的数学逻辑思维。计算机基础包括计算硬件知识,计算机网络知识,计算机软件知识。

其次编程技术要牢固

最起码要擅长两三门编程语言技术,熟悉他们底层开发逻辑原理,熟悉常见的数据结构和算法。

算法研究

熟练使用常见的各种算法,不但学习和研究新的算法逻辑,从开源算法研究中归纳总结和改进提出自己的意见。

网友:数理土豆饼

回答时间:2020年08月15日

我的经验,动态演示网站,看每种算法运行过程的动态过程,比纯粹看书,理解的快的多,先搞清楚设计算法的目的,运处,看了动态演示 以后,再通过文字叙述和程序 理解算法的实现细节。另外 普林斯顿大学 cos 226 课程 的在线 ppt ,也写的非常好,内容丰富,可以帮助和加深理解。比如他在说明算法渐进复杂度时,说了一个,1000个数,计算所有三个数组合和等于0的个数的例子,这个一般教材没有,促使人思考。某些教程 作者 自己也 没有理解到位,把简单的事情,叙述的难懂了