自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 【算法】滑动窗口—最小覆盖子串

最小覆盖子串“问题,难度为Hard,题目如下:给你两个字符串 S 和 T,请你。如果 S 中没有这样一个子串,则算法返回空串,如果存在这样一个子串,则可以认为答案是唯一的。比如输入 S = "ADBECFEBANC",T = "ABC",算法应该返回 "BANC"。思路很简单,但显然不是我们想要的。

2024-09-14 20:22:35 1345

原创 【算法】动态规划—最长回文子序列

关于”回文串“的问题,是面试中常见的,本文提升难度,讲一讲”最长回文子序列“问题,题目很好理解:输入一个字符串 s,请找出 s 中的最长回文子序列长度。比如输入 s="aecda",算法返回3,因为最长回文子序列是 "aca",长度是3。。一定要记住这个定义才能理解算法。为什么这个问题要这样定义二维的 dp 数组呢?,这样定义容易归纳,容易发现状态转移关系。

2024-09-13 21:47:44 1026

原创 【算法】动态规划—编辑距离

给你两个单词 和 , 请返回将 转换成 所使用的最少操作数 。你可以对一个单词进行如下三种操作: 编辑距离问题就是给定两个字符串 s1 和 s2,只能用三种操作把 s1 变成 s2,求最少的操作数。需要明确的是,不管是把 s1 变成 s2 还是反过来,结果都是一样的,所以下面就以 s1 变成 s2 举例。 解决两个字符串的动态规划问题,一般都是用两个指针 i, j 分别指向两个字符串的最后,然后一步步往前走,缩小问题的规模。 设两个字符串分别为 "rad"

2024-09-13 14:59:21 1026

原创 【算法】BFS—解开密码锁的最少次数

一个密码锁由 4 个环形拨轮组成,每个拨轮都有 10 个数字:。每个拨轮可以自由旋转:例如把'9'变为'0''0'变为'9'。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为'0000',一个代表四个拨轮的数字的字符串。列表deadends包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。字符串target代表可以解锁的数字,请给出解锁需要的最小旋转次数,如果无论如何不能解锁,返回-1。

2024-09-12 23:59:36 654

原创 【算法】动态规划—最长公共子序列

专门让索引为0的行和列表示空串,dp[0][..],dp[..][0]都应该初始化为0,这就是 base case。比如按照刚才dp数组的定义,dp[0][3]=0 的含义是:对于空字符串 "" 和 "bab",其LCS的长度为0。因为一个字符串是空串,它们的最长公共子序列的长度显然应该是0。

2024-09-12 18:01:49 1067

原创 面向对象中的原型

在 JS 中,每个对象都有一个内部属性 [[prototype]] (通过 __proto__ 访问),指向它的原型对象。原型对象也是一个普通对象,它有自己的属性和方法,并且也可以有自己的原型,从而形成原型链。当访问一个对象的属性或方法时,如果对象本身没有该属性或方法,JS 会沿着原型链向上查找,直到找到该属性或到达原型链的末端 (null)。JS 通过原型机制实现了继承,即对象(实例)可以共享原型对象的属性的方法。

2025-02-11 11:53:05 415

原创 鸿蒙虚拟运行环境

文件名改成 Hyper.cmd。

2024-10-14 01:11:27 364

原创 【表达式求值算法】拆解复杂问题:实现计算器

表达式求值算法是个 Hard 级别的问题,本次就来解决它。最终实现一个包含如下功能的计算器:1.输入一个字符串,可以包含 + - * / 、数字、括号以及空格,算法返回运行结果。2.要符合运算规则,括号的优先级最高,先乘除后加减。3.除号是整数除法,无论正负都向0取整(5/2=2,-5/2=-2)。4.可以假定输入的算式一定合法,且计算过程不会出现整型溢出,不会出现除数为0的意外情况。

2024-09-24 19:17:09 693

原创 【JavaSE】Java注解

我们最早使用的注解有:方法重写 @Override,在编译期间进行硬性检测,加在方法上就表明该方法是从父类重写过来的。Java 注解(Annotation)又称 Java 标注,它可以用来对类、方法、属性、参数、包等进行标注,然后让编译器或运行时其他类进行解析,完成某个功能,注解也可以编译到字节码文件中。当然它也支持自定义 Java 标注。

2024-09-22 20:14:30 577

原创 【JavaSE】IO模型

IO,英文全称是 Input/Output,翻译过来就是输入/输出。我们听得挺多,就是磁盘 IO,网络 IO 等。IO 即输入/输出,到底谁是输入?谁是输出?IO 如果脱离了主体,会让人疑惑。

2024-09-22 18:29:08 922

原创 【Java集合】深入了解ArrayList实现原理

1.数据存储是基于动态数组实现的,默认初始容量为10。2.添加数据时,首先需要检查元素个数是否超过数组容量,如果超过了则需要对数组进行扩容(1.5倍);插入数据时,需要将从插入点 k 开始到数组末尾的数据全部向后移动一位。3.数组的扩容是新建一个大容量(原数组大小 + 扩容容量)的数组,然后将原数组的数据拷贝到新数组。数组扩容操作的代价比较高,如果能预估数据量,那么就给 ArrayList 分配一个较大的初始值,可以减少调整大小的开销,ArrayList支持缩容,但不会自动缩容。

2024-09-21 22:06:48 406

原创 【二分搜索】二分搜索代码模板

二分搜索框架下面这首算法小诗出自《labuladong的算法小抄》二分搜索套路歌二分搜索不好记,左右边界让人迷。小于等于变小于,mid加一又减一。就算这样还没完,return应否再减一?信心满满刷力扣,通过比率二十一。我本将心向明月,奈何明月照沟渠!labuladong从天降,一同手撕算法题。管它左侧还右侧,搜索区间定乾坤。搜索一个元素时,搜索区间两端闭。while条件带等号,否则需要打补丁。if相等就返回,其他的事甭操心。mid必须加减一,因为区间两端闭。

2024-09-20 21:36:32 825

原创 【JVM】本地方法接口和执行引擎

简单来讲,一个 Native Method 就是一个 java 调用非 java 代码的接口,。一个Native Method 是这样一个 java 方法:该方法的底层实现由非 Java 语言实现,比如 C。这个特征并非 java 特有,很多其他的编程语言都有这一机制在定义一个 native method 时,并不提供实现体(有些像定义一个 Javainterface),因为其实现体是由非 java 语言在外面实现的。

2024-09-20 18:00:42 743

原创 【JVM】运行时数据区

按照不同的数据分区进行存储(方法区、堆、栈、本地方法栈、程序计数器)。

2024-09-18 18:34:43 1581

原创 【动态规划】凑零钱问题

搞清楚上面的几个关键点,解法的伪代码就可以写出来了:# 伪码框架。

2024-09-17 23:21:00 1174

原创 【JVM】类加载

类加载器子系统负责从文件系统或者网络中加载 class 文件。ClassLoader 只负责 class 文件的加载,至于它是否可以运行,则由 Execution Engine 决定。加载的类信息存放于一块称为方法区的内存空间。class file 存在于硬盘上,可以理解为设计师画在纸上的模板,而最终这个模板在执行的时候是要加载到 JVM 当中的,根据这个模板实例化出 n 个实例 .class file 加载到 JVM 中,被称为 DNA 元数据模板。

2024-09-16 22:38:34 1161

原创 【动态规划】最长递增子序列

动态规划的核心设计思想是数学归纳法。例如,输入 nums = [10,9,2,5,3,7,101,18],其中最长递增子序列是 [2,3,7,101],所以算法的输出应该是4。类似的,设计动态规划算法,需要一个 dp 数组,可以假设 dp[0...i-1] 都已经被算出来了,然后问自己:怎么通过这些结果算出 dp[i]?显然,可能形成很多种新的子序列,但是只选最长的哪一个,把最长子序列的长度作为 dp[5] 的 值即可。注意:“子序列”和“子串”这两个名词的区别,子串一定是连续的,而子序列不一定是连续的。

2024-09-16 15:18:03 684

原创 【JVM】概述

Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三方Java框架(如Spring、MyBatis等)构成。在国内,有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富,相比而言,有关Java虚拟机的资料却显得异常贫乏。这种状况很大程度上是由Java开发技术本身的一个重要优点导致的:在虚拟机层面隐藏了底层技术的复杂性以及机器与操作系统的差异性。

2024-09-15 17:51:25 802

原创 【面向对象】设计模式分类

创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,提供了。

2024-09-15 11:57:48 566

原创 【算法】 滑动窗口—最长无重复子串

我们要的是最长无重复子串,哪一个阶段可以保证窗口中的字符是没有重复的呢?这里和之前不一样,要在收缩窗口完成后更新 res,因为窗口收缩的 while 条件是存在重复元素,换句话说收缩完成后一定保证窗口中没有重复。比如,输入 s = "aabab",算法返回2,因为无重复的最长子串是 "ab" 或者 "ba",长度为2。当 window[c] 值大于1时,说明窗口中存在重复字符,不符合条件,就该移动 left 缩小窗口了。输入一个字符串 s,请计算 s 中不包含重复字符的最长子串长度。

2024-09-15 01:08:46 360

原创 【算法】滑动窗口—找所有字母异位词

比如输入 S = "cbaebabacd",T = "abc",算法返回 [0,6],因为 S 中有两个子串 "cba" 和 "bac" 是 T 的排列,它们的起始索引是0和6。给定一个字符串 S 和一个非空字符串 T,找到 S 中所有是 T 的字母异位词的子串,返回这些子串的起始索引。所谓的字母异位词,其实就是全排列,原题目相当于让你找 S 中所有 T 的排列,并返回它们。和寻找字符串的排列一样,只是找到一个合法异位词(排列)之后将起始索引加入 res 即可。

2024-09-15 00:41:17 359

原创 【算法】滑动窗口—字符串的排列

比如输入 S = "helloworld",T = "oow",算法返回 True,因为 S 包含一个子串 "owo" 是 T 的排列。输入两个字符串 S 和 T,请你用算法判断 S 是否包含 T 的排列,也就是要判断 S 中是否存在一个子串 是 T 的一种全排列。这明显是关于滑动窗口算法的题目,

2024-09-14 22:28:16 350

原创 【算法】滑动窗口代码模板

这个算法的时间复杂度是O(N),比字符串暴力算法要高效得多。其中两处 sout 表示更新窗口数据的地方,直接往里面填具体逻辑就行了。而且,这两处操作分别是右移和左移窗口更新操作,它们的操作是完全对称的。滑动窗口算法技巧的思路非常简单,就是维护一个窗口,不断滑动,然后更新答案。

2024-09-14 13:35:24 380

原创 【JavaSE】String 和 int 相互转换的方法

【代码】String 和 int 相互转换的方法。

2024-09-11 23:58:29 210

原创 【JavaSE】ArrayList、LinkedList和Vector的区别

因为 LinkedList 的每个节点除了存储元素,还要存储两个指针,一个指向前驱,一个指向后继。Vector 和 ArrayList 相似,但属于强同步类,内部由于synchronized 同步关键字的存在,其方法都是同步的,保证了线程安全。如果程序本身是线程安全的,使用ArrayLIst是更好的选择。的新数组,然后将原数组中的数据拷贝到新数组中。如果能预估数据量,那么就给 ArrayList 分配一个较大的初始值,可以减少调整大小的开销,ArrayList支持缩容,但不会自动缩容。

2024-09-09 13:13:11 659

原创 【并发编程】synchronized锁状态和底层实现

锁的状态是通过对象监视器在对象头中的字段来表明的,四种状态会随着竞争的情况逐渐升级。偏向锁、轻量级锁、重量级锁是针对synchronized的状态。这四种状态都不是 Java 语言中的锁,而是 JVM 为了提高锁的获取与释放效率而做的优化(使用synchronized时)无锁:没有任何线程使用锁对象。偏向锁:当前只有一个线程访问,在对象头 Mark World 中记录线程id,下次此线程访问时,可以直接获取锁。

2024-08-19 20:24:56 386

原创 【并发编程】Java中锁的分类

Java中很多锁的名词,并不是全指锁,有的是指,有的是指,有的是指下面总结的内容是对每个锁的名词进行一定的解释。

2024-08-17 14:27:29 254

原创 【并发编程】如何保证原子性

同一时刻只有一个线程执行,我们称之为互斥,如果我们能够保证对共享变量的修改是互斥的,那么就能保证原子性了。

2024-08-16 16:18:36 298

原创 【并发编程】volatile关键字

volatile具备可见性、有序性,不具备原子性,并不能保证线程安全,但常与CAS结合,形成一种高性能的无锁。Java内存模型JMM,它规定所有变量都存储在主内存,每个线程都有自己的工作内存,其中保存了主内存变量的副本。当变量被volatile修饰,变量发生修改时,值会立即被更新到主存,其他线程可以及时在内存中读取到最新值。并发编程有三要素:原子性、可见性、有序性。

2024-08-10 16:31:25 141 1

原创 【并发编程】并发编程的核心问题

由于想让程序响应处理速度更快,Java内存模型设计有主内存和工作内存(线程使用的内存),线程不能直接对主内存中的数据进行操作,必须将主内存数据加载到工作内存(本地内存),这样在多核CPU下就会产生不可见性,我们的目标就是要做到可见性。可以解决不可见性,volatile修饰的变量在一个线程修改后,其他线程立即可见。还可以解决乱序性,volatile修饰的变量在执行时禁止指令重排序,但不能解决非原子性问题。乱序性:指令在执行的过程中,为了优化,一些指令的顺序会发生改变,这种改变可能会影响程序的整个运行结果。

2024-08-10 16:24:48 166

原创 【MySQL】聚簇索引和非聚簇索引

但是 innodb 中也存在非聚簇索引,就是除主键索引(一级索引)之外的索引,也叫辅助索引。例如为 name 列添加索引(二级索引),我们通过 name 找到后并不能找到数据,而是需要再找到主键索引,通过主键索引找到数据,这种索引也称为非聚簇索引。索引的存储和数据的存储是分离的,也就是说找到了索引但没找到数据,需要根据索引上的值(主键)再次回表查询,非聚簇索引。找到了索引就找到了需要的数据,那么这个索引就是聚簇索引,所以 innodb中的主键就是聚簇索引(一级索引)。

2024-01-25 19:35:47 214

原创 【MySQL】索引的分类

即一个索引包含多个列,在数据库操作期间,复合索引比单值索引所需要的开销更小(对于相同的多个列建索引),当表的行数远大于索引列的数目时可以使用复合索引。select * from table where b=’’and c=’’索引不生效。select * from table where a=’’and b=’’索引生效。select * from table where b=’’and a=’’索引生效。select * from table where a=’’and c=’’索引生效。

2024-01-24 20:47:16 397

原创 【MySQL】索引数据结构

MySQL最终选择B+树作为索引数据结构,因为B树虽是多路平衡树,但叶子节点之间没有联系;B+树是多路平衡树,一个节点可以存储更多的数据,数据记录都存放在叶子节点中,这样非叶子节点就可以存储更多索引,所有叶子节点之间还有一个链指针。MySQL使用自增主键,如果使用二叉树作为索引数据结构,自增时二叉树会像链表一样单边增长;红黑树虽然会旋转平衡,但也是一边的增长,树的高度大。(全表扫描,范围查找)

2024-01-24 20:25:17 440

原创 【MySQL】MySQL引擎

通过选择不同的技术,能够获得额外的速度或者功能,从而改善应用的整体功能。MyISAM 也是 MySQL 的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当 INSERT(插入)或 UPDATE(更新)数据时即写操作需要锁定整个表,也就是只有表锁(并发量小),效率便会低一些;InnoDB 是一个事务型的存储引擎,有行级锁(并发量大)和外键约束,支持全文检索(全文索引),它的设计目标是处理大容量数据库系统,MySQL 运行时 Innodb 会在内存中建立缓冲池,用于缓冲数据和索引;

2024-01-24 19:20:50 438 1

原创 Mysql架构

第二层架构主要完成大多数的核心服务功能,如 SQL 接口,并完成缓存的查询,SQL 的分析和优化及部分内置函数的执行。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化,如确定查询表的顺序,是否利用素引等,最后生成相应的执行操作。存储引擎层,存储引擎真正的负责了 MysQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信。不同的存储引擎具有的功能不同,可以根据实际需要进行选取。数据存储层,主要是将数据存储在设备的文件系统之上,并完成与存储引擎的交互。(处理客户端连接请求)

2024-01-24 19:04:44 380 1

原创 Servlet的过滤器与Spring拦截器的区别

拦截器(Interceptor)属于 Spring 框架中定义的,只能拦截到达Spring控制器(Controller)中的请求。过滤器(Filter)属于Java Servlet 规范中定义的,可以拦截所有进入Java后端的请求;

2024-01-24 12:54:13 375 1

原创 Bean循环依赖

3.由于 BeanB 需要 BeanA,此时可以在第三级缓存中找到 BeanA 工对象,注入给BeanB,然后将 BeanB 放入到二级缓存,从三级缓存中删除 BeanB 工厂对象,注入到 BeanB,完成 BeanB 的初始化,放入到一级缓存。1.初始化 BeanA,需要注入 BeanB,去查找,BeanB,没有找到,把 BeanA 交给一个工厂对象,将 BeanA 工厂对象存入到三级缓存中。4.当 BeanB 完成初始化后,将完整的 BeanB 注入到 BeanA 中,完成 BeanA 的初始化。

2024-01-24 12:39:12 433 1

原创 【单例模式】懒汉式单例(双重检索 + volatile关键字)

/ 给方法加锁,虽然能解决线程安全问题,但并发访问效率低,一次只能有一个线程进入。// 在第一次获取单例对象时才创建对象。// 双重检索 + volatile。// 在类加载时不创建单例对象。// 存在线程安全问题。

2024-01-23 20:33:31 398 1

原创 BeanFactory 和 ApplicationContext

2.BeanFactory接口是spring容器中最底层(顶层)的接口,面向spring框架,很多的内部的工厂类都实现该接口。3.ApplicationContext 接口继承了BeanFactory接口,面向应用程序,提供额外的功能。1.BeanFactory和ApplicationContext都是spring框架提供的接口。5.实现了ApplicationContext接口的工厂类,在程序启动时就会创建初始化。4.实现了BeanFactory接口的工厂类,在使用某个对象时才会去创建初始化。

2024-01-23 20:15:46 425 1

原创 Java反射机制

(2)Field类表示Class对象所表示的类的成员变量,通过它可以在运行时动态修改成员变量的属性值(包含private):当一个对象被创建之后,使用反射来获取对象的Class对象,通过这个Class对象可以获取这个类的所有属性和方法。(3)Method类表示Class对象所表示的类的成员方法,通过它可以动态调用对象的方法(包含private):通过反射,可以动态调用一个对象的方法,即使这个对象的私有的,也仍然可以调用。(3)获取任意对象的属性,并且能改变对象的属性。(6)实例化任意一个类的对象。

2024-01-23 19:41:20 409 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除