我说我不会算法,阿里把我挂了。[通俗易懂]

我说我不会算法,阿里把我挂了。[通俗易懂]不说了,字节跳动也反手把我挂了。

大家好,又见面了,我是你们的朋友全栈君。

前言

工作已经有一段时间了,有的时候会跟同事们打趣:“如果你让我现在去手写一个快速排序,我怕是真的写不出来”。

如果不接触一段时间的算法,真的很容易就忘了。不信?你现在想想你自己能不能手写一个堆排序。

经历过校招的人都知道,算法和数据结构都是不可避免的。

在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。

在面试(现场面或者视频面)的时候也会问算法题,难度肯定是没有笔试的时候那么难的。我们可以想象一个场景,一面面试面到一半,面试官让你反转二叉树,问问现在的自己,你还会吗。

不扯远了,如果还在上大学的同学可以先以排序和各种的基本数据结构开始入门。

下面来简单介绍一下八大基础排序和基础的数据结构
我说我不会算法,阿里把我挂了。[通俗易懂]

冒泡排序

思路:俩俩交换,大的放在后面,第一次排序后最大值已在数组末尾。因为俩俩交换,需要n-1趟排序(比如10个数,需要9趟排序)

代码实现要点:两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数每趟过后,比较的次数都应该要减1

我说我不会算法,阿里把我挂了。[通俗易懂]

选择排序

思路:找到数组中最大的元素,与数组最后一位元素交换。当只有一个数时,则不需要选择了,因此需要n-1趟排序

代码实现要点:两个for循环,外层循环控制排序的趟数,内层循环找到当前趟数的最大值,随后与当前趟数组最后的一位元素交换

我说我不会算法,阿里把我挂了。[通俗易懂]

插入排序

思路:将一个元素插入到已有序的数组中,在初始时未知是否存在有序的数据,因此将元素第一个元素看成是有序的。与有序的数组进行比较,比它大则直接放入,比它小则移动数组元素的位置,找到个合适的位置插入。当只有一个数时,则不需要插入了,因此需要n-1趟排序

代码实现:一个for循环内嵌一个while循环实现,外层for循环控制需要排序的趟数,while循环找到合适的插入位置(并且插入的位置不能小于0)

我说我不会算法,阿里把我挂了。[通俗易懂]

我说我不会算法,阿里把我挂了。[通俗易懂]

快速排序

学习快速排序的前提:需要了解递归

思路:在数组中找一个元素(节点),比它小的放在节点的左边,比它大的放在节点右边。一趟下来,比节点小的在左边,比节点大的在右边。不断执行这个操作….

代码实现:支点取中间,使用L和R表示数组的最小和最大位置。不断进行比较,直到找到比支点小(大)的数,随后交换,不断减小范围。递归L到支点前一个元素(j)。递归支点后一个元素(i)到R元素

我说我不会算法,阿里把我挂了。[通俗易懂]

归并排序

学习归并排序的前提:需要了解递归

思路:将两个已排好序的数组合并成一个有序的数组。将元素分隔开来,看成是有序的数组,进行比较合并。不断拆分和合并,直到只有一个元素

代码实现:在第一趟排序时实质是两个元素(看成是两个已有序的数组)来进行合并,不断执行这样的操作,最终数组有序,拆分左边,右边,合并…

我说我不会算法,阿里把我挂了。[通俗易懂]

堆排序

学习堆排序的前提:需要了解二叉树

思路:堆排序使用到了完全二叉树的一个特性,根节点比左孩子和右孩子都要大,完成一次建堆的操作实质上是比较根节点和左孩子、右孩子的大小,大的交换到根节点上,直至最大的节点在树顶。随后与数组最后一位元素进行交换

代码实现:只要左子树或右子树大于当前根节点,则替换。替换后会导致下面的子树发生了变化,因此同样需要进行比较,直至各个节点实现父>子这么一个条件

我说我不会算法,阿里把我挂了。[通俗易懂]

希尔排序

思路:希尔排序实质上就是插入排序的增强版,希尔排序将数组分隔成n组来进行插入排序,**直至该数组宏观上有序,**最后再进行插入排序时就不用移动那么多次位置了~

代码思路:希尔增量一般是gap = gap / 2,只是比普通版插入排序多了这么一个for循环而已。

我说我不会算法,阿里把我挂了。[通俗易懂]

基数排序(桶排序)

思路:基数排序(桶排序):将数字切割成个、十、百、千位放入到不同的桶子里,放一次就按桶子顺序回收一次,直至最大位数的数字放完~那么该数组就有序了

代码实现:先找到数组的最大值,然后根据最大值/10来作为循环的条件(只要>0,那么就说明还有位数)。将个位、十位、…分配到桶子上,每分配一次就回收一次

我说我不会算法,阿里把我挂了。[通俗易懂]

递归

递归在算法里边用得非常非常多,排序算法的快速排序和归并排序就需要用到递归(至少用递归来实现是最方便的)。

想要用递归必须知道两个条件:递归出口(终止递归的条件)和递归表达式(规律)

技巧:在递归中常常是将问题切割成两个部分(1和整体的思想),这能够让我们快速找到递归表达式(规律)

我说我不会算法,阿里把我挂了。[通俗易懂]

汉罗塔实现:

我说我不会算法,阿里把我挂了。[通俗易懂]

基本数据结构

链表、队列、二叉树、栈都是些非常基本的数据结构。针对每种的数据结构都会有对应的算法题,比如说:

  • LeetCode No206:反转链表
  • LeetCode No20:检验字符串[]{]}{]{}(这样的字符串是否有效(对齐)
  • LeetCode No104:树的最大深度
  • LeetCode No102:层序遍历树

在校招不求字典树、红黑树、图这种数据结构要会,但链表、队列、二叉树、栈这些数据结构的题(LeetCode简单) 还是应该要能做出来。

img

涵盖Java后端所有知识点的开源项目(已有5.8K star):https://github.com/ZhongFuCheng3y/3y

如果大家想要实时关注我更新的文章以及分享的干货的话,微信搜索Java3y

PDF文档的内容均为手打,有任何的不懂都可以直接来问我(公众号有我的联系方式)。

我说我不会算法,阿里把我挂了。[通俗易懂]

我说我不会算法,阿里把我挂了。[通俗易懂]

我说我不会算法,阿里把我挂了。[通俗易懂]

我说我不会算法,阿里把我挂了。[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144733.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • layoutparams方法_layoutinflater是什么

    layoutparams方法_layoutinflater是什么http://www.2cto.com/kf/201606/514962.html在上一篇文章里,我总结了一下自定义控件需要了解的基础知识:View的绘制流程——《自定义控件知识储备-View的绘制流程》。其中,在View的测量流程里,View的测量宽高是由父控件的MeasureSpec和View自身的LayoutParams共同决定的。MeasureSpec是什么,上一篇文章里已经说

    2022年9月21日
    0
  • exec 与 exec sp_executesql 的用法及比较[通俗易懂]

    exec 与 exec sp_executesql 的用法及比较[通俗易懂]exec与exec sp_executesql 都可以用于执行动态sql。下面先介绍它们的用法,然后再对它们进行比较(下面用到的数据库表来自SQLSERVER的示例数据库AdventureWorks2008)一、exec与exec sp_executesql 用法1.动态sql(使用字符串拼接的方式)declare@FName2varchar(20)=’Ken’,  …

    2022年5月21日
    37
  • springboot的单元测试(junit单元测试实例)

    转载 原文:https://www.codenong.com/cs106212170/文章目录一.Junit测试二.集成测试1.SpringBoot测试-测试其中的Bean2.SpringBootWeb测试-启动tomcat3.SpringBootWeb测试-不启动tomcat(模拟环境)三.单元测试1.web层测试2.mybtismapper测试3.测试任意的bean4.Mock操作四.相关注解的汇总五.参考网站一.Junit测试当你的单元测试代码不需要用到..

    2022年4月13日
    31
  • 模糊PID算法及其MATLAB仿真(1)

    模糊PID算法及其MATLAB仿真(1)目录1、PID控制2、模糊控制3、模糊PID简介4、模糊自整定PID的理论内容(重点内容)4.1基本原理4.2模糊子集及其论域的确定4.3模糊规则的建立4.4模糊推理1、PID控制PID控制是及其普遍的控制方法,主要分为位置式PID和增量式PID,主要方程大家可以查看其他资料,这里就不作详细的解释了,另外还需要了解阶跃响应曲线上面的超调…

    2022年6月3日
    40
  • 决策树算法(ID3)

    决策树算法(ID3)

    2021年11月19日
    41
  • c中给字符数组,字符串指针赋值的方法总结[通俗易懂]

    在写程序的时候,总是搞混,现在总结一下以免以后再犯chara[10];怎么给这个数组赋值呢?谭浩强的书上明确指出,字符数组可以在定义时整体赋值,不能再赋值语句中整体赋值。1、定义的时候直接用字符串赋值chara[10]=”hello”;注意:不能先定义再给它赋值,如chara[10];a[10]=”hello”;这样是错误的!2、对数组中字符逐个赋值chara

    2022年4月15日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号