刷了一个月leetcode算法,成功收下阿里巴巴、网易等大厂的offer

秋招总结:花了半年时间,准备Java后端开发工程师的面试,最终让我收获了8个大厂offer Persist,and anything is within your reach. 坚持下来,做任何事情你都能成功。 关注再看,养成习惯,大家好,我是程序哥!微信搜索【VeryJava】关注一下,这很Java。本文 GitHub https://github.com/clsaa/very-java 已收录,整理了本人面试过程学习的知识,正在逐步开放,欢迎Star和Fork。 绪论 想写这篇文章,已经很久了,之前在准备秋招的时候,就一直想着如果我能顺利拿到offer,一定也写一篇博客总结一下。毕. 阅读详情

前言

随着互联网寒潮的到来, 越来越多的互联网公司提高了面试的难度,其中之一就是加大了面试当中手撕算法题的比例。这里说的算法题不是深度学习,机器学习这类的算法,而是排序,广度优先,动态规划这类既考核数据结构也考核编程能力的题目。刷题的网址非常的多,其中以leetcode是最为出名的。

在刷题上,我花了大量的时间,蹚了许多的坑,总结了一下,主要有这三个问题:

  1. 刷过的题老是忘,第二次刷的时候还是不会做
  2. 刷题的速度很慢,即使花一天时间,也常常只能刷五六道
  3. 坚持不下来,老是刷到一半就停滞下来了,当我第二次再来刷的时候,前面刷过的题都又忘的差不多

说出来都是泪,感觉刷题这个路是真的难走,花了很多时间,但是感觉没有什么收获。所以最近我一直在反思自己刷题的方法,希望能够提高刷题的效率和速度。当我总结了以下方法以后,我很明显的感受到自己的刷题速度从以前周末的一天五六道提升到周末一天刷十五六道以上,速度相比以前提升的非常明显。

本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上。亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位。

常用数据结构

数组

数组是相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。数组的优点是:get和set操作时间上都是O(1)的;缺点是:add和remove操作时间上都是O(N)的。

Java中,Array就是数组,此外,ArrayList使用了数组Array作为其实现基础,它和一般的Array相比,最大的好处是,我们在添加元素时不必考虑越界,元素超出数组容量时,它会自动扩张保证容量。

Vector和ArrayList相比,主要差别就在于多了一个线程安全性,但是效率比较低下。如今java.util.concurrent包提供了许多线程安全的集合类(比如 LinkedBlockingQueue),所以不必再使用Vector了。

链表

链表是一种非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表由一系列结点组成。链表的优点是:add和remove操作时间上都是O(1)的;缺点是:get和set操作时间上都是O(N)的,而且需要额外的空间存储指向其他数据地址的项。

查找操作对于未排序的数组和链表时间上都是O(N)。

队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,亦即所谓的先进先出(FIFO)。

Java中,LinkedList实现了Deque,可以做为双向队列(自然也可以用作单向队列)。另外PriorityQueue实现了带优先级的队列,亦即队列的每一个元素都有优先级,且元素按照优先级排序。

栈

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。它体现了后进先出(LIFO)的特点。

Java中,Stack实现了这种特性,但是Stack也继承了Vector,所以具有线程安全线和效率低下两个特性,最新的JDK8中,推荐用Deque来实现栈。

集合

集合是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素,其主要特性是元素不可重复。

在Java中,HashSet 体现了这种数据结构,而HashSet是在MashMap的基础上构建的。LinkedHashSet继承了HashSet,使用HashCode确定在集合中的位置,使用链表的方式确定位置,所以有顺序。TreeSet实现了SortedSet 接口,是排好序的集合(在TreeMap 基础之上构建),因此查找操作比普通的Hashset要快(log(N));插入操作要慢(log(N)),因为要维护有序。

散列表

散列表也叫哈希表,是根据关键键值(Keyvalue)进行访问的数据结构,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数。

Java中HashMap实现了散列表,而Hashtable比它多了一个线程安全性,但是由于使用了全局锁导致其性能较低,所以现在一般用ConcurrentHashMap来实现线程安全的HashMap(类似的,以上的数据结构在最新的java.util.concurrent的包中几乎都有对应的高性能的线程安全的类)。TreeMap实现SortMap接口,能够把它保存的记录按照键排序。LinkedHashMap保留了元素插入的顺序。WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收,而不需要我们手动删除。

树

树(tree)是包含n(n>0)个节点的有穷集合,其中:

  • 每个元素称为节点(node)
  • 有一个特定的节点被称为根节点或树根(root)
  • 除根节点之外的其余数据元素被分为m(m≥0)个互不相交的结合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)

树这种数据结构在计算机世界中有广泛的应用,比如操作系统中用到了红黑树,数据库用到了B+树,编译器中的语法树,内存管理用到了堆(本质上也是树),信息论中的哈夫曼编码等等等等,在Java中TreeSet和TreeMap用到了树来排序(二分查找提高检索速度),不过一般都需要程序员自己去定义一个树的类,并实现相关性质,而没有现成的API。

下面用Java来实现各种常见的树。

二叉树

二叉树是一种基础而且重要的数据结构,其每个结点至多只有二棵子树,二叉树有左右子树之分,第i层至多有2(i-1)个结点(i从1开始);深度为k的二叉树至多有2(k)-1)个结点,对任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。

二叉树的性质:

  • 在非空二叉树中,第i层的结点总数不超过2^(i-1), i>=1;
  • 深度为h的二叉树最多有2^h-1个结点(h>=1),最少有h个结点;
  • 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
  • 具有n个结点的完全二叉树的深度为log2(n+1);
  • 有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:若I为结点编号则 如果I>1,则其父结点的编号为I/2;如果2I<=N,则其左儿子(即左子树的根结点)的编号为2I;若2I>N,则无左儿子;如果2I+1<=N,则其右儿子的结点编号为2I+1;若2I+1>N,则无右儿子。
  • 给定N个节点,能构成h(N)种不同的二叉树,其中h(N)为卡特兰数的第N项,h(n)=C(2*n, n)/(n+1)。
  • 设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i。

满二叉树、完全二叉树

满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点;

完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树;

满二叉树是完全二叉树的一个特例。

二叉查找树

二叉查找树,又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

  • 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
  • 左、右子树也分别为二叉排序树;
  • 没有键值相等的节点。

二叉查找树的性质:对二叉查找树进行中序遍历,即可得到有序的数列。二叉查找树的时间复杂度:它和二分查找一样,插入和查找的时间复杂度均为O(logn),但是在最坏的情况下仍然会有O(n)的时间复杂度。原因在于插入和删除元素的时候,树没有保持平衡。我们追求的是在最坏的情况下仍然有较好的时间复杂度,这就是平衡二叉树设计的初衷。

平衡二叉树

平衡二叉树又被称为AVL树,具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。它的出现就是解决二叉查找树不平衡导致查找效率退化为线性的问题,因为在删除和插入之时会维护树的平衡,使得查找时间保持在O(logn),比二叉查找树更稳定。

堆

堆是一颗完全二叉树,在这棵树中,所有父节点都满足大于等于其子节点的堆叫大根堆,所有父节点都满足小于等于其子节点的堆叫小根堆。堆虽然是一颗树,但是通常存放在一个数组中,父节点和孩子节点的父子关系通过数组下标来确定。

堆的用途:堆排序,优先级队列。此外由于调整代价较小,也适合实时类型的排序与变更。

最后

写着写着就发现要想总结到位是一项非常庞大的工程,路漫漫其修远兮,吾将上下而求索。

我个人认为,作为技术人就要保持终生学习的态度,让学习力成为核心竞争力,才能不被时代所淘汰,而高效的时间支配能让你变得更加优秀,所以,我在这里将这份耗时两个月搜集的算法刷题书籍,送给有需要的人,希望这些资料能对大家有所帮助

《算法》

《算法刷题Leetcode版》

yolov8x-p2 实现 tensorrt 推理 yolov8x-p2, tensorrt 实现. 阅读详情

相关推荐

制作 img系统镜像的详细方法

      I.MX6开发板目前支持从TF卡和eMMC启动,启动时,由于各个不同的启动文件对路径有不同的要求,例如uboot文件要求位于启动设备的某个块,dtb文件要求在FAT分区上,文件系统要求在Linux分区上,基于此,我们目前采用将映像制作成img文件的方式,这样可以更简单完成对启动卡的制作。 关于如何制作img,方法如下:方法一  Windows下面利用Win32工具1.   准备我司提供...

armkits的博客 4万+

数据结构——四叉树

四叉树(Quadtree)是一种用于表示和管理二维空间的树状数据结构。它将二维空间递归地分割成四个象限,每个象限可以继续分割,以实现对空间的更精细的划分。四叉树通常用于解决空间搜索和查询问题,例如碰撞检测、图像压缩、地理信息系统等领域。特别适合大规模的广阔室外场景管理。一般来说如果游戏场景是基于地形的(甚至没有高度)(如城市、平原、2D场景),那么适合用四叉树来管理。而如果游戏场景在高度轴上也有大量物体需要管理(如太空、高山),那么适合用八叉树来管理。

weixin_43945471的博客 4935

风控IV、AUC、KS python计算代码

df_temp:数据集,Y:是否逾期标签,feas_list:需要计算IV的 变量。2、 按月和不同Y 下的 IV计算。

暮雨听轩的专栏 1618

大厂面试为什么总考算法?以及如何避开算法面试。

对于一个具体的工程问题,没有受过专业训练的人,很容易忽略复杂的细节,将问题想简单。但是,这么一个简单的“盖房子”的工程问题,凝聚了人类几千年的智慧结晶,里面包含了诸多复杂的工程问题。这是一个很大的范畴,想象力,创造力,反应力,记忆力,归纳总结能力,表达能力,等等等等,都能装进这个篮子里。实际上,我个人认为:在面试中,更多地考察操作系统,编译原理,网络基础等等知识,是更加合理,也是更实用,有意义的。因为这个算法本质就是从一堆元素中,每次随机取一个,然后将这个元素删除,再随机取一个,再删除,以此类推。

weixin_48157259的博客 1163

Nordic nRF52832实战:手把手教你搭建智能手环BLE通信框架(附完整代码)

本文详细介绍了如何使用Nordic nRF52832芯片搭建智能手环的BLE通信框架,涵盖芯片优势、协议栈初始化、低功耗广播策略及健康数据服务实现。通过完整代码示例和架构设计,帮助开发者快速掌握蓝牙低功耗通信技术,适用于可穿戴设备开发。

weixin_29192141的博客 247

k8s部署 普罗米修斯(Prometheus)监控

Prometheus是一个开源的服务监控系统和时序数据库其提供了通用的数据模型和快捷数据采集、存储和查询接口它的核心组件Prometheus服务器定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉 取数据新拉取到啊的 数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。

D2961953033的博客 3855

【算法与数据结构】LeetCode介绍、简单排序算法、数组(笔记一)

最近博主学习了算法与数据结构的一些视频,在这个文章做一些笔记和心得,在学习时已经有C, C++的基础。文章附上了学习的代码,仅供大家参考。如果有问题,有错误欢迎大家留言。

晚安的博客 1145

避坑指南:Qt无边框窗口拖动+阴影效果这些细节要注意

本文深入探讨了Qt无边框窗口开发中实现流畅拖动与阴影效果的关键细节与常见陷阱。针对高DPI屏幕适配、阴影闪烁、拖动卡顿及多显示器兼容性等核心难题,提供了从QGraphicsDropShadowEffect原理剖析到手动绘制优化、坐标系统精准处理及平台原生事件拦截的实战解决方案,帮助开发者构建稳定、美观的商业级应用界面。

weixin_27943395的博客 479

算法思想——LeetCode

文章目录算法思想递归楼梯问题动态规划宝石挑选动态规划概述 算法思想 递归 递归指的是在函数的定义中使用函数自身的方法 递归需要注意的三个点: 1.明确递归终止条件; 2.给出递归终止时的处理办法; 3.提取重复的逻辑,缩小问题规模 楼梯问题 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? /** * * 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 * 每次你可以爬 1 或 2 个台阶。你有多少

ch123456hy的博客 306

逆向实战:我是如何一步步解开美团外卖App的mtgsig3.0签名(附关键代码片段)

本文详细记录了逆向分析美团外卖App的mtgsig3.0签名算法的全过程,从抓包到算法还原,包括Java层和Native层的深度分析。通过Frida、IDA Pro等工具,揭示了签名生成的多层加密流程,并提供了关键代码片段。文章还探讨了逆向工程中的反调试对抗和签名时效性问题,为安全研究人员提供了宝贵的技术参考。

weixin_42530732的博客 872

Unity 面试篇⚠️ | Unity性能优化好,山寨机都能跑~

Unity 面试篇⚠️ | Unity性能优化好,山寨机都能跑~

m0_58523831的博客 1万+

【转】刷了一个月leetcode算法,成功收下阿里巴巴、字节跳动、网易等大厂的offer

转:https://zhuanlan.zhihu.com/p/90057817 前言 随着互联网寒潮的到来, 越来越多的互联网公司提高了面试的难度,其中之一就是加大了面试当中手撕算法题的比例。这里说的算法题不是深度学习,机器学习这类的算法,而是排序,广度优先,动态规划这类既考核数据结构也考核编程能力的题目。刷题的网址非常的多,其中以leetcode是最为出名的。 在刷题上,我花了大量的时...

Jaylon Wang的专栏 584

2025.06.16【转录组】|Ribo-seq数据流程详解(二 基因组比对)

本文详细介绍了Ribo-seq数据分析中的比对流程,包括环境准备、STAR索引构建、比对参数设置及结果统计可视化。通过samtools和R脚本实现比对质量评估,提供常见问题解决方案和关键指标解读。该流程强调比对参数优化和质量控制,为后续翻译组学分析奠定基础。

1979

国内应届生是不是把Leetcode刷的滚瓜烂熟就能进google了?

别说进Google,有可能工作都找不到。 为什么有些人刷刷LeetCode就能Offer拿到手软,而有些人LeetCode滚瓜烂熟,项目也做了一两个,还找不到工作呢? 我参加校招也参加几年了,今天我们跟大家讲讲大学生校招到底需要什么能力? 记得帮我点赞哦。 一、程序员找工作,真正需要的是什么能力? 首先,光靠会算法和数据结构,就肯定能找得到工作吗? 如果答案是肯定的,那每年找不到工作的大学生就有福音了,死命刷LeetCode就好。 事实当然不是如此! 大学生参加校招,靠的是四个光环:学.

启舰 5万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

实习程序员拿下9家大厂的前端校招offer,分享月薪破万的成功秘诀

我就读于北京理工大学软件工程专业,是一名大四学生。从大一开始投入以前端为主的全栈开发,独立开发过多个中型和小型项目 在学校里读书的时候,我就是一个闲不住的人。最近因为一个偶然的契机,接触到了校招季,最后定下了本科毕业就工作的规划目标。 于是我在一个月的时间里参加了9家国内大厂校招,收获了如下结果(截至2019年9月5日): 腾讯(WXG):等待二面 阿里巴巴(淘宝FED):三面等结果 字节跳动...

在线学习web前端开发教程 494

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

面试 10+公司,囊获 8 个Offer,面经全公开

作者| 码农唐磊来源| 程序猿石头(ID:tangleithu)最近陆陆续续已经开始校招(秋招)了,现在分享下石头当年参加校招的一些经历。本文最早是发布在 blog 上的,现在通过公...

程序人生的博客 2183

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

2021年暑期实习面经汇总,字节两面,阿里三面成功拿下offer!

个人介绍 我是双非普本硕,本科一般,从研究生开始到现在,主要学习的语言是java和Python,期间因为疫情的原因,在家呆了8个多月,把Python和java基础又强化了一遍,找过一些博客和github上的案例做过实现。后来研二上学期开学,主要学的是java大数据方向。 实习经历 研究生期间我没做过实际项目,所做的一些小案例都是从github和b站做的实现。我感觉是用来加深知识理解的。今年年初找了一份日常实习,三个月,主要做的是Python爬虫和数据清洗。从3月开始,用晚上和周末的时间开始刷题,改简历。 找

weixin_53224039的博客 717

非科班生背水一战,最终拿下阿里字节等大厂offer

内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、 Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、 Linux 等技术栈

javaAnPou的博客 171

2024 校招,我是如何拿到小米、京东、字节大厂前端offer

一份漂亮的简历,需要包括以下部分(排版由上而下)个人亮点(专精领域,个人博客,开源项目)教育经历(毕业院校,在校经历、荣誉)工作经历(实习)项目经历专业技能扎实的前端基础,比如你知道作用是什么?flex:1的 1 代表什么?Generator如何抛出错误?熟悉一门前端框架(React 优先)勤刷 LeetCode 的算法题,熟悉掌握相应的数据结构如常见的链表、栈、队列、哈希表、树熟悉网络基础、Git 命令、Linux 命令。

2401_84093248的博客 867

GitHub 上四万 Star 大佬的BATT求职回忆

相关阅读:阿里职位层级(附P级详细要求)Java性能优化的50个细节(珍藏版)最全BATJ大厂面试题整理!(速度收藏)转载自:微信公众号:程序员江湖本文作者,在他的 Gi...

emprere的博客 363

一名双非程序媛面试蚂蚁、美团、携程等大厂拿offer分享面试过程

今天小编给大家带来一个优秀妹子的后台面试经验总结,希望对正在面试或者以后需要面试的人提供一些参考和帮助

m0_62051288的博客 426

Leetcode 剑指 Offer II 054. 把二叉搜索树转换为累加树

投的java后端,因为家里穷,想进大厂改变下命运,前前后后刷了400多道题,八股也看了很多遍,源码也卷了,也有小的实习经历,平时一堆人说我技术好,最后互联网小厂。2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连,孩子不能选相邻的格子,不能回头选,不能选超过一圈,但是。双非中医药学校营销专业,不想当药代,跨到互联网运营,大家帮帮忙改改简历吧😭😭 #最后再改一次简历# #简历被挂麻了,求建议# #23届找工作求助阵地# #你。

2301_78234743的博客 392

中高级前端面试经验整理

没有更好的选择,那么,这就是最好的选择。 有时候,人在职场容易想当然: 我工作得久了,就应该加薪; 我跳槽后,工资肯...

小生方勤 794
上一篇: 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题
下一篇: 五年从程序员到架构师,这是我见过史上最好程序员的职业规划
跟着我学Java
博客等级 码龄6年 660粉丝 1341原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值