- 博客(16)
- 收藏
- 关注
原创 7.面试算法-链表之高频面试题(二)
通过上面的这些题目,我们能感受到链表的题目真是不少,但是大部分常规题目,都是从增删改查变换或者组合而来的。这些题目大部分一看就知道该怎么做,但是要写出来甚至运行成功,难度还是很大的,所以,我们需要耐住寂寞,认真练习,只有练会了才可能在考场上应对自如,这就是所谓的思维能力了。在上面这些题目中,需要特别强调的就是反转相关的几个问题必须都要会,因为这几个问题的考察频率非常高,而且对链表的能力要求也不低,必须好好掌握。
2024-08-24 13:14:04
998
原创 6.面试算法-链表之高频面试题(一)
这是一道经典的链表问题先看一下题目。输入两个链表,找出它们的第一个公共节点。例如下面的两个链表:两个链表的头结点都是已知的,相交之后成为一个单链表,但是相交的位置未知,并且相交之前的结点数也是未知的,请设计算法找到两个链表的合并点。这种问题该怎么入手呢?如果一时想不到该怎么办呢?其实这时候我们可以将常用数据结构和常用算法都想一遍,看看哪些能解决问题。常用的数据结构有数组、链表、队、栈、Hash 、集合、树、堆。常用的算法思想有查找、排序、双指针、递归、迭代、分治、贪心、回溯和动态规划等等。
2024-08-11 10:05:10
918
原创 5.面试算法-链表之链表基础
删除的过程不算复杂,重点也是找到要删除的结点curNode的前驱结点preNode,只要将preNode的next设置为 null。例如下图中删除40,其前驱结点为7。在操作链表的时候有个问题千万别忘了,不管你后面怎么处理,最后访问链表的时候还是从head开始的,所以一定要保证有一个指针指向head。千万注意别狗熊掰棒子。双向链表顾名思义就是既可以向前,也可以向后,这是与单向链表最大的区别。有两个指针的好处自然是在指针在中间位置的时候,操作更方便。
2024-08-11 01:24:47
914
原创 1.数据结构与算法扫盲
目前比较认可的算法定义是:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或者多个操作。这里我们可以看到算法是为了解决一个或者一类具体问题的,没有万能算法。例如回溯是为了解决暴力搜索都不好解决的问题,贪心是为了解决通过最优子问题求解就能得到全局最优的问题等等。另外一点就是算法是很具体的,为了解决某个或者某类问题,需要一系列完整的步骤,每个步骤对应一定的操作序列,每个操作都完成特定的功能,这就是算法了。还有一点就是一个问题可能有多种算法能解决。
2024-08-10 23:46:28
1069
原创 4.面试算法-数组之大厂冲刺题
我们总结了一维数组的基本问题和一些常见面试题,万事开头难,练习好了,对于我们后面继续学习其他内容非常有好处。我们说算法要看清本质,看清内在逻辑。本质是什么呢?其实就是如何针对其特征进行高效增删改查。而每种特征 又可以扩展出大量的题目,也就是所谓的小专题了。因为每个特征都有自己的共性问题和基础问题,所以我们刷题的目标就是搞清楚这些共性问题如何处理。例如数组的基本问题就是准确控制指针的移动,而添加删除的时候要注 意如何处理数据大量移动的问题,进制问题要处理如何连锁修改数据的问题等等。
2024-08-04 12:53:31
582
原创 3.面试算法-数组之基础过关题
我们前面说过数组里的元素是紧紧靠在一起的,不能有空隙,后面的元素就要整体向前移动,同样如果在中间位置插入元素,那么其后的元素都要整体向后移动。很多算法问题需要多次反复移动,比如说连续删除多个元素,这就导致会频繁大量地移动元素,进而效率低下,执行超时。所以如何尽量减少大量元素移动的次数就是数组相关算法要突破的第一个问题。这里介绍一种非常简单,但是非常有效的——双指针。所谓的双指针其实就是两个变量,不一定真的是指针,这里只是一个统称。
2024-08-04 12:50:14
891
原创 2.面试算法-数组之数组基础
数组是所有人闭着眼都知道的基本数据结构。在LeetCode中官方统计是1000多道与数组有关。不过,数组是很多高级算法的载体,例如排列组合、集合、动态规划等等,因此题目的难度跨度非常大,这里先学习一些基础的。算法要找到根,要看透本质,那本质到底是啥呢?其实就是数组的增删改查,其实任何数据结构的基本操作都是这几个,大部分题目都是基于这几个操作的拓展,因此将其搞清楚就掌握一半了。增删改查看似简单,但是面试的时候却非常危险,经常会翻车。
2024-08-04 12:41:06
727
原创 3.并发编程之可见性
线程安全性之可见性有序性看下面的代码,t1线程中用到了stop属性,在main线程中修改了stop属性的值来使得t1线程结束,但是t1线程并没有按照期望的结果执行。public class VolatileDemo { public static boolean stop=false; public static void main(String[] args) throws InterruptedException { Thread t1=new Thread(()->{
2021-11-16 00:14:58
727
原创 2.并发编程之同步锁
并发编程之同步锁1 线程的安全性并发给我们带来的问题就是,当多个线程操作同一个数据的时候,往往不能得到我们预期的结果,造成这个问题的原因是什么呢?其实就是该数据对多个线程没有可见性,这些线程不能有序性的去操作这个公共的数据,操作数据时还不是原子操作,所以导致预期结果不一致。因此我们可以总结出线程的安全性的三个体现:原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作(Synchronized、AtomicXXX、Lock)。可见性:一个线程对主内存进行了修改,可以及时被其他线程观察到(Syn
2021-10-24 21:43:51
959
原创 1.并发编程之线程原理
并发编程之线程原理1 多线程的基本原理线程的start方法,实际上底层做了很多事情,具体的实现简图如下:OS调度算法有很多,比如先来先服务调度算法(FIFO)、最短优先(对短作业的优先调度)、时间片轮转调度等。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dst73hrg-1635005660765)(/Users/xuzhengzheng/software/java course/并发编程/线程简图.png)]1.1 线程的状态线程在运行过程中,会存在几种不同的
2021-10-24 00:16:12
162
原创 4.Mybatis的核心工作原理之SQL执行
Mybatis的核心工作原理之SQL执行 从宏观角度学习Mybatis的架构、工作原理、主要模块,从微观角度学习Mybatis的工作原理与设计思想。一、SQL执行我们看看Mybatis的SQL语句具体执行过程。List<User> list = mapper.selectUserList();前面我们讲了所有的Mapper都是JDK动态代理对象,所以任意的方法的都是执行管理类MapperProxy的invoke()方法。1.MapperProxy.invoke() @Over
2021-09-06 00:03:41
238
原创 3.Mybatis的核心工作原理之SqlSession与Mapper
Mybatis的核心工作原理之SqlSession与Mapper 从宏观角度学习Mybatis的架构、工作原理、主要模块,从微观角度学习Mybatis的工作原理与设计思想。一、SqlSession每一次的操作数据库,都需要创建一个会话,我们用到openSession()方法来创建。接下来我们来看看SqlSession创建过程中都做了哪些步骤。SqlSession sqlSession = factory.openSession();通过前面对SqlSessionFactory源码的解析,我们
2021-08-24 23:11:38
294
原创 2.Mybatis的核心工作原理之SqlSessionFactory
Mybatis的核心工作原理之SqlSessionFactory 从宏观角度学习Mybatis的架构、工作原理、主要模块,从微观角度学习Mybatis的工作原理与设计思想。一、SqlSessionFactory首先我们来看下SqlSessionFactory的获取:SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);1.SqlSessionFactoryBuilder首先我们new了一个SqlSessio
2021-07-08 00:02:57
1103
原创 1.Mybatis的体系结构与核心工作原理
Mybatis的体系结构从宏观角度学习Mybatis的架构、工作原理、主要模块,从微观角度学习Mybatis的工作原理与设计思想。一、体系结构1.三层划分介绍Mybatis的整体架构从宏观上可分为三层,分别是基础支持层、核心处理层和接口层。如下图:Mybatis主要工作流程图:在Mybatis主要工作流程里,不同的功能由很多不同的类协作完成,它们分布在Mybatis的不同的Package里面。1.1 接口层 接口层的核心是SqlSession,它是上层应用和Mybatis打交道的桥
2021-07-05 22:32:02
434
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人