1024 节日快乐

没错,程序员节 节日快乐!!!

后续的 《数据结构与算法之美》 我就不发布了,毕竟这是大神的付费文章,有兴趣还是去订阅他的讲课,支持一下知识产权。不过我还是会贴出一些课后习题,记录自己的一些学习感受和成果吧。

为什么要学算法?

因为算法无处不在,在生活中我们也会遇到,比如

你看,不会算法,我们连Wi-Fi密码都破译不了,

……

开一个玩笑, 我想很多人都想到了, 因为要面试啊。是的,面试是会问到算法,其实生活上也用的到,比如找女朋友,
由数学家 Merrill M. Flood 在 1949 提出的,他命名为“未婚妻选择问题”,可以看作是基于苏格拉底的 麦穗原理 得出的数学版本,这里有一篇文章可以去看看传送门

1
炮灰男友数量EX=1/e*N=36.8%*N,其中N为预计所有男朋友的数量。

这只是一个尴尬而不失礼貌的例子,只为了说明,生活中的很多看起来很复杂的决策,原来都可以用算法来解决。

那为什么面试会问到算法呢?

因为如果把编程比喻武学,那么算法就是驱动,是内功,内功雄厚,就可以像鸠摩智一样用小无相功催动的少林七十二绝技。编程亦然,掌握算法,了解核心思想那么就可以快速入门一门语言。所以大家都比较看重内力,这个是最能体现武学造诣。

我们知道了算法的重要性,那么就要开始入门,掌握一下算法的基本概念。

算法入门

看到这个图,心里肯定是一万匹羊驼跑过

要是这么好入门,我会在这里写心得?不存在的。还是得靠自己去学习,比如一些有趣的书籍,大神推荐了一本趣味性的入门级书,《算法图解》,可以去试试。

最优方案

算法入门之后,我们就需要对一些需求进行算法分析了。

正确的算法思路

此时我的心情是

这个小朋友的脑回路清奇,分分钟拿出了一个别具一格的方案,关键是真的解决了需求呀。当然实际上,这个就属于修炼内功出错的情况,方案肯定是不行的,说到这,就要提一下武学奇才 欧阳锋,修炼了错误的九阴真经居然真的成功了。但不是所有人都是欧阳锋,但正确的解决方案和算法分析都需要深厚的算法理论才行,欧阳锋九阴逆行,估计也是内功深厚啊。这里大神是推荐了一本书《数据结构和算法分析》.

内力深厚是离不开平时的苦修和练习的,所以这里附上《数据结构与算法之美》的第七章的课后习题,以及我对题目自己的想法,作为修炼,因为oc是兼容c的,所以我就直接使用了混编编写

接招

  • 单链表反转
  • 链表中环的检测

  • 两个有序的链表合并

  • 删除链表倒数第 n 个结点

  • 求链表的中间结点

单链表反转

我的想法是 假如有一个链表A,我们申明两个结点,一个持有当前结点的上一个结点O,一个持有当前结点的下一个结点Q,遍历链表A的所有结点P,Q指向P->next,P->next=O.需要注意边界问题

链表中环的检测

单链的中环检测 概念 如图: (也就是单链中存在循环)

  • 单链表中环的检测

首先设置两个指针,分别命名为fast和slow,fast指针每次向后移2步,slow指针每次向后移1步。

如果,fast指针最后走到尾结点,则没有环。
如果,fast指针和slow指针相遇,则证明有环。

  • 环的起始结点的查询

当fast与slow相遇之后,
fast指针从头结点开始走,每次走1步
当fast再次与slow相遇以后,相遇处的结点为环的入口结点

两个有序的链表合并

我暂时没有很好的思路,只是想着用遍历A链表,用B链表的去比较大小,小,就插入A链表头,再用B链表的对比;如果,大,则比较下一个A链表结点。(里面需要用到多个临时结点)

删除链表倒数第 n 个结点

用3个指针,A,B,C,其中A正常, B落后A n 步,C 再落后 B 一步,同时遍历链表,等A走到链表结尾的时候,B就是要删除的结点P,C就是P的前一个结点。

求链表的中间结点

同理 快慢指针,还有注意最后快指针的奇偶。

我的作业Git地址 传送门