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

news2025/2/27 23:20:56

前言

有人调侃我们说:

  • 程序员不如送外卖。送外卖是搬运食物,自己是搬运代码,都不产出新的东西……
  • 透支体力,又消耗健康,可替代性极强,30岁之后就要面临被优化的危险……
  • 想跳槽,但是更高的平台难进,同级别的平台又是重复……
  • 想利用业余时间学习提升,但是自己能力有限,很难形成知识体系…

这些其实都是初级程序员面临的困境,当你提高自身能力,登上更高的层级之后,无论薪资还是发展都会有很大的提升。

那么问题来了,怎么才能度过初级程序员的瓶颈,进阶成为高薪工程师呢?

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常见的链接命令有几种?分别是什么?

链接命令是创建链接文件&#xff0c;链接文件分为软链接和硬链接&#xff0c;软链接的作用是方便文件的快速访问&#xff0c;而硬链接的作用是可以给重要文件创建硬链接能够防止文件数据被误删。 学习目标&#xff1a;能够说出软链接的创建方式和硬链接的创建方式。 教程推荐…

青岛地铁交通咨询系统

大二课程《数据结构》课程设计项目&#xff0c;仅供参考 C&QT 项目地址 1.(重要)后台数据处理&#xff1a;使用图结构存储数据&#xff0c;利用最短路径选择算法进行路径选择&#xff1b; 2.检测输入框是否为空及输入合法性&#xff0c;使用模糊搜索实现站点的选择引导 &…

5.1获取物理内存容量

5.1获取物理内存容量 5.1.1学习Linux获取内存的方法 在 Linux 2.6 内核中, 是用 detect_memory 函数来获取内存容量的 其函数在本质上是通过调用 BIOS 中断 0x15 实现的&#xff0c; 分别是BIOS 中断 0x15 的3个子功能, 子功能号要存放到寄存器EAx或Ax中, 如下&#xff1a; 1…

【数据结构与算法】BFS 和 DFS

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;数据结构与算法 &#x1f320; 首发时间&#xff1a;2022年11月16日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e…

关于混合SDN网络的统一信息模型方面研究事件通知的多样性问题

关于混合SDN网络的统一信息模型方面研究事件通知的多样性问题面向混合SDN中异构设备的混合域发现协议Hybrid Domain Discovery Protocol (HDDP)HDDP的主要特点混合域发现协议(HDDP)协议介绍过程总结申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引…

阿里云研发工程师刘睿:阿里云消息生态及最佳实践

2022 年 9 月 24 日&#xff0c;阿里云用户组&#xff08;AUG&#xff09;第 12 期活动在厦门举办。活动现场&#xff0c;阿里云消息中间件研发工程师刘睿&#xff0c;向参会企业代表分享了阿里云消息生态及最佳实践。本文根据演讲内容整理而成。 众所周知&#xff0c;消息中间…

智能生活 App 垂直品类- IPC SDK 架构及快速集成配置(安卓版)

除了通用设备功能的应用开发&#xff0c;针对部分常见的全屋智能场景设备&#xff0c;智能生活 App SDK 提供了单独的垂直品类 SDK。包括智能摄像机 SDK、智能门锁 SDK、扫地机机器人 SDK、智能照明控制 SDK 等。 基于 智能生活 App SDK&#xff0c;垂直品类 SDK 面向这些特定…

适合编程初学者的开源博客系统(Flutter版)

目标 为编程初学者打造入门学习项目&#xff0c;使用各种主流编程语言来实现。让想学编程的&#xff0c;一个都不落下。 上述基本涵盖了当前编程开发所有主流语言&#xff08;我这里说的主流&#xff0c;直白点讲就是互联网公司都在用的&#xff09;。 左侧为前端版本&#x…

即将学习3D建模看过来,超高性价比电脑推荐

虽说建模还是台式最好&#xff0c;但是需要外出或者带回家工作的时候还是不方便的❌&#xff0c;咱们来看下怎么挑&#xff5e; 我们使用的建模软件为3DsMax、maya、zbrush等 建模的时候&#xff0c;对显卡和内存的要求较高&#x1f250; 显卡越好&#xff0c;模型面数多了也…

pwn调试环境搭建

应用场景 不同的pwn题有不同的环境要求&#xff0c;堆题要求更多&#xff0c;patchelf可以满足一定场景的实现&#xff0c;但终究不如在实际对应的环境中搭建。如何快速搭建一个高效节省资源的环境也是一个不小的问题。 方法 高效节省资源&#xff1a;一个主要调试环境多个运…

CE修改植物大战僵尸-天上无限掉落阳光(小宇特详解)

CE修改植物大战僵尸-天上无限掉落阳光 里是CE修改植物大战僵尸的第三个博客&#xff0c;其他的操作请看我之前的博客。 天上无限掉落阳光。 这里说明一下版本&#xff1a; CE&#xff1a;CE6.8 植物大战僵尸版本&#xff1a;植物大战僵尸95版 具体步骤 我们在刚出现阳光…

英国Essay写作降重方法有哪些?

英国留学生写Essay的时候会遇到抄袭率比较高的情况&#xff0c;当参考别人的文章的同时&#xff0c;不知不觉也就会让文章的重复率有所增加&#xff0c;有效减少重复率修改的方法你清楚吗&#xff1f;下文为大家讲解一下降低英国Essay写作降重的方法。 When British overseas s…

汇编语言实验8:BIOS/DOS功能调用与宏指令程序设计

《汇编语言程序设计》实验报告实验八 BIOS/DOS功能调用与宏指令程序设计1. 实验目的2. 实验任务3.1 BIOS/DOS及宏汇编程序题目设计3.2 编写代码3.3 代码分析3.4 运行测试4. 实验总结实验八 BIOS/DOS功能调用与宏指令程序设计 1. 实验目的 掌握汇编语言程序设计的基本方法和技…

基于工业级4G5G路由器大型设备远程无线监控方案

一、行业背景进入21世纪&#xff0c;我国经济持续高速发展&#xff0c;全球各地的企业对大型设备的需求日益旺盛&#xff0c;例如工业锅炉、数控车床、医疗器械等&#xff0c;在产品服务业全球的时候&#xff0c;产品厂家需要对所有在外的设备进行远程监控管理&#xff0c;实时…

Linux 内存管理知识总结(二)

Linux 内存管理框架 传统的多核运算是使用 SMP(Symmetric Multi-Processor )模式&#xff1a;将多个处理器与一个集中的存储器和 I/O 总线相连&#xff0c;所有处理器访问同一个物理存储器&#xff0c;因此 SMP 系统有时也被称为一致存储器访问&#xff08;UMA&#xff09;结构…

Leetcode刷题day1|数组一|704.二分查找,27.移除元素,35.搜索插入位置

文章目录一、面试中数组相关理论知识二、二分查找问题思路注意事项AC代码三、移除元素思路注意事项AC代码四、寻找插入位置思路AC代码五、总结二分法|二分查找法|二分搜索法|二分易错点相关概念代码实现一、面试中数组相关理论知识 数组是非常基础的数据结构&#xff0c;在面试…

【树状数组】前缀和问题

一、引子 给你一个数组 nums &#xff0c;请你完成两类查询。 其中一类查询要求更新数组 nums 下标对应的值另一类查询要求返回数组 nums 中索引 left 和索引 right 之间&#xff08; 包含 &#xff09;的nums元素的和 题目只是一个用来检测我们思想的东西&#xff0c;比如这…

Android BottomSheet总结

文章目录Android BottomSheet总结BottomSheetBottomSheetDialogBottomSheetDialogFragment全屏无阴影BottomSheetDialogFragment代码下载Android BottomSheet总结 BottomSheet XML布局&#xff1a; <?xml version"1.0" encoding"utf-8"?> <an…

C++ 条件变量的使用

绪论 并发编程纷繁复杂&#xff0c;其中用于线程同步的主要工具——条件变量&#xff0c;虽然精悍&#xff0c;但是要想正确灵活的运用却并不容易。 对于条件变量的理解有三个难点&#xff1a; 为什么wait函数需要将解锁和阻塞、唤醒和上锁这两对操作编程原子的&#xff1f;为…

MCMC学习笔记-马尔科夫链概述

参考文章&#xff1a;MCMC(二)马尔科夫链 - 刘建平Pinard - 博客园 写给小白看的马尔科夫链&#xff08;Markov Chain&#xff09;最佳入门教程_许进进的博客-CSDN博客_markov链 目录 1.马尔科夫链概述 1.1股票市场模型 2.马尔科夫链模型状态转移矩阵的性质 (本节重点) 2.…