刷了一个月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是最为出名的。

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

刷过的题老是忘,第二次刷的时候还是不会做

刷题的速度很慢,即使花一天时间,也常常只能刷五六道

坚持不下来,老是刷到一半就停滞下来了,当我第二次再来刷的时候,前面刷过的题都又忘的差不多

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

本文采用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版》

细节增强卷积DEConv详解及代码复现 这种预训练模型能够捕捉图像的基本特征,为后续的端到端训练提供良好的初始参数。例如,在RESIDE和RESIDE-6K数据集上的实验结果表明,使用MSPLCK模块的MixDehazeNet-L模型在RESIDE-IN数据集上首次超过了42dB的PSNR指标,且在所有数据集上均优于先前的方法。例如,在RESIDE和RESIDE-6K数据集上的实验结果表明,使用MSPLCK模块的MixDehazeNet-L模型在RESIDE-IN数据集上首次超过了42dB的PSNR指标,且在所有数据集上均优于先前的方法。 阅读详情

相关推荐

基于FPGA的示波器设计

ADC 、DAC、FPGA、LCD液晶、示波器

FDL_AQ的博客 1万+

leetcode刷了900道题,依然找不到工作!刷题根本没用,让别人喜欢你才行!

找工作刷题管用吗?一位程序员吐槽:leetcode刷了900题也没有找到工作,所以刷题没用,怎么改变性格,让别人喜欢你,比天天刷八股文找工作好太多了。以后要搞人际关系,再也不刷题了。同行采访实录你觉得刷题对找工作有用吗?如果没用,那什么做法才管用?我们采访了一些程序员,听听大家怎么说:1.有人说,自己刷了一千多道题,面试机会都拿不到。2.有人说,自己985本硕,工作5年,刷了1700题,周赛220...

架构师小秘圈 1840

微信小程序订阅消息实战:如何绕过长期订阅限制实现多次发送(附PHP代码)

本文针对微信小程序开发者无法获取长期订阅消息权限的痛点,提供了一套完整的实战解决方案。通过深入剖析一次性订阅与长期订阅的规则差异,结合巧妙的交互设计、稳健的PHP服务端发送引擎(含高并发处理与失败重试机制)以及授权池管理等高级策略,帮助开发者在合规前提下,构建高可用的消息推送系统,有效提升通知触达率与用户体验。

weixin_29008805的博客 620

一个月刷400道leetcode之后的经验与心得总结、真题整理分享

假设一个同学在面试的时候,先写时间复杂度和空间复杂度最高的方法,面试官很有可能会问你这个题目有更优的解法吗,你再写时间复杂度和空间复杂度稍低一点的解法,如果面试官继续问你能不能更优化一点,你再写出时间复杂度和空间复杂度最优的方案,面试官会认为你的思考是有深度的,如果一开始就写出时间复杂度和空间复杂度最优的方法,面试官只是会觉得这个题目你以前做过而已。所以我们在刷题的时候,为了节约时间,五分钟没有思路,就别浪费时间了,直接看答案. 另外一个原因,面试的时候,也不可能让你思考很久。刷题最重要的是速度和效率。

生活需要深度 2695

【ESP32-S3量产指南】基于Flash下载工具实现Release模式Flash加密与安全配置

本文详细介绍了ESP32-S3量产阶段如何通过Flash下载工具实现Release模式下的Flash加密与安全配置。从加密模式选择、工具配置到分区表优化,提供了一套完整的量产安全解决方案,帮助开发者有效防止固件泄露和篡改,确保设备安全。

weixin_28730131的博客 230

免Root抓包神器Packet Capture:安卓App数据捕获全攻略

本文详细介绍了免Root安卓抓包神器Packet Capture的安装与使用全攻略。通过利用安卓系统的VPN Service API,该工具无需Root权限即可捕获并解密App的HTTP/HTTPS网络流量。文章从核心原理、证书安装、实战抓包步骤到结果分析与常见问题排查,提供了完整指南,是移动端开发、安全测试和数据分析的实用利器。

weixin_29232507的博客 1073

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

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

启舰 5万+

PLC编程标准之争:IEC61131与IEC61499核心区别与选型指南

在工业自动化领域,PLC编程长期依赖IEC61131标准,它定义了梯形图、结构化文本等语言,通过周期扫描机制保证确定性执行。然而,随着工业4.0和分布式控制场景的兴起,IEC61499以事件驱动模型打破传统范式,让功能块能跨设备协同,实现更灵活的柔性产线和模块化系统。理解两者在程序结构、数据交互、部署方式和实时性上的差异,是选型与工程落地的关键。本文从基础概念出发,剖析执行模型与架构演进,结合一线调试经验,帮助工程师在传统PLC与下一代标准之间做出理性决策。

weixin_27014595的博客 268

一个多月数据结构与算法的学习经验之谈

今天圣诞节,首先祝大家圣诞节快乐!最近一个多月,一直在Leetcode上学习数据结构与算法,补了很多之前的基础,之后慢慢发现,我对数据结构和算法还停留在很初级阶段,这让我感到异常的恐慌和不安,因为工作都三年多了,对这些基础知识还没办法熟练掌握,实属不该,该好好反思自己这些年来都做了些什么。 听很多初级开发人员说,数据结构和算法在实际开发中用不到,但真实情况是,熟练掌握了这些,无论你用...

weixin_33949359的博客 734

深入解析高通Adreno DPU的DRM/KMS驱动架构与硬件协同设计

本文深入解析了高通Adreno DPU的DRM/KMS驱动架构与硬件协同设计,详细介绍了Adreno DPU的核心模块组成、显示接口设计以及DRM驱动架构。通过实际案例和调试技巧,帮助开发者理解硬件与软件的协同工作原理,优化显示性能并解决常见问题。

weixin_29266679的博客 436

6.8 点云相关软件——CoProcess

摘要 CoProcess是华测导航研发的三维点云全流程处理平台,支持海量数据浏览、编辑及多类型成果输出,适配地形测绘、道路建设等行业需求。软件采用模块化设计,包含基础功能(数据导入、分类、建模等)和行业定制模块(地形、道路、矿山等),支持多格式数据交互与自动化处理,显著提升作业效率。相比Lidar360,CoProcess操作更简便、性价比更高;相比开源工具CloudCompare,其行业适配性与专业功能更优。2025版本优化了数据处理性能与智能算法,需授权激活高级功能,适合商业项目应用。

qq625924821的博客 248

只靠刷leetcode能通过算法面试吗?面试200+经验分享高效解题思维,四周搞定大厂算法面试!

首先要清楚一点:刷题的目的是通过应试,重点不在于“数量”,而在于方法+捷径,找对学习方法,拿到offer真不是什么难事! 从面试官角度来看,算法可以看出应聘者的解题思路,以及迅速变成代码的能力。比如一些二叉树相关题目,就能体现面试者对数据结构的熟练度以及分析算法复杂度的能力。

m0_57042151的博客 443

11、Windows Autopilot 部署与设备注册全攻略

本文详细介绍了Windows Autopilot的完整部署流程,涵盖注册配置文件设置、注册状态页面(ESP)配置、设备注册方法(包括CSV导入、JSON注入、在线注册等)、自动化脚本实现及故障排除技巧。通过手动与PowerShell自动化两种方式指导用户完成配置,并提供流程图、最佳实践和常见问题解答,帮助IT管理员高效实现设备零接触部署与管理。

ii567的博客 342

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

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

Jaylon Wang的专栏 584

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

实习程序员拿下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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

weixin_53224039的博客 716

非科班生背水一战,最终拿下阿里字节等大厂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届找工作求助阵地# #你。

han_xue_feng的博客 377
上一篇: 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题
下一篇: 彻夜怒肝阿里限量版性能调优+微服务+高并发设计笔记,目标月薪40K
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值