- 博客(67)
- 收藏
- 关注
原创 【算法】滑动窗口—最小覆盖子串
最小覆盖子串“问题,难度为Hard,题目如下:给你两个字符串 S 和 T,请你。如果 S 中没有这样一个子串,则算法返回空串,如果存在这样一个子串,则可以认为答案是唯一的。比如输入 S = "ADBECFEBANC",T = "ABC",算法应该返回 "BANC"。思路很简单,但显然不是我们想要的。
2024-09-14 20:22:35
1497
原创 【算法】动态规划—最长回文子序列
关于”回文串“的问题,是面试中常见的,本文提升难度,讲一讲”最长回文子序列“问题,题目很好理解:输入一个字符串 s,请找出 s 中的最长回文子序列长度。比如输入 s="aecda",算法返回3,因为最长回文子序列是 "aca",长度是3。。一定要记住这个定义才能理解算法。为什么这个问题要这样定义二维的 dp 数组呢?,这样定义容易归纳,容易发现状态转移关系。
2024-09-13 21:47:44
1137
原创 【算法】动态规划—编辑距离
给你两个单词 和 , 请返回将 转换成 所使用的最少操作数 。你可以对一个单词进行如下三种操作: 编辑距离问题就是给定两个字符串 s1 和 s2,只能用三种操作把 s1 变成 s2,求最少的操作数。需要明确的是,不管是把 s1 变成 s2 还是反过来,结果都是一样的,所以下面就以 s1 变成 s2 举例。 解决两个字符串的动态规划问题,一般都是用两个指针 i, j 分别指向两个字符串的最后,然后一步步往前走,缩小问题的规模。 设两个字符串分别为 "rad"
2024-09-13 14:59:21
1128
原创 【算法】BFS—解开密码锁的最少次数
一个密码锁由 4 个环形拨轮组成,每个拨轮都有 10 个数字:。每个拨轮可以自由旋转:例如把'9'变为'0''0'变为'9'。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为'0000',一个代表四个拨轮的数字的字符串。列表deadends包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。字符串target代表可以解锁的数字,请给出解锁需要的最小旋转次数,如果无论如何不能解锁,返回-1。
2024-09-12 23:59:36
843
原创 【算法】动态规划—最长公共子序列
专门让索引为0的行和列表示空串,dp[0][..],dp[..][0]都应该初始化为0,这就是 base case。比如按照刚才dp数组的定义,dp[0][3]=0 的含义是:对于空字符串 "" 和 "bab",其LCS的长度为0。因为一个字符串是空串,它们的最长公共子序列的长度显然应该是0。
2024-09-12 18:01:49
1207
原创 【ArkTS】多线程面试题
重量级的线程机制。它让主线程和一个后台线程进行通信。。每个 Worker 线程都有自己的生命周期和全局对象。核心 ApiTaskPool:轻量级的线程池机制。它将任务(函数)分发到工作线程执行,并返回结果给主线程。,它帮你管理线程生命周期,效率更高。核心 Api这是最常用的方法,它将一个函数抛到任务池中异步执行。可以同时执行多个任务,等待所有任务完成。可以取消尚未执行的任务。
2025-09-02 13:15:03
189
原创 【Harmony OS】组件化开发原理和实现思路
鸿蒙组件化开发原理是将大型的应用程序或系统分解成更小的、独立的、可复用的组件。每个组件都封装了特定的功能或界面,并且有自己的生命周期和状态管理。什么意思? 分布式架构是指将一个应用程序的不同功能部件(组件)拆开,不仅可以运行在同一个设备上,还可以分散到多个不同的设备上运行和协同工作。对用户来说,感觉像是在使用一个完整的应用,但实际上背后是多个设备在共同提供服务。举例说明:一个典型的例子是 “分布式视频通话”。传统方式: 你用手机视频通话,摄像头、屏幕、扬声器、计算处理都在这一台手机上。鸿蒙分布
2025-08-28 03:09:58
837
原创 JS 中的 Promise(手撕源码)
在 JS 中,Promise 是异步编程的一种解决方案。Promise用于处理回调地狱,因为 then 方法的存在,可通过链式调用将多层嵌套的回调函数“展开”为线性结构,使得代码更加扁平化,从而避免了传统回调地狱的缩进灾难。它代表一个异步操作的最终完成(或失败)及其结果值。缺点就是:仍然需要通过 .then() 处理结果,不如 async/await 直观。下面将直接通过手撕核心源码(不处理特殊情况)的方式来理解 Promise 的底层逻辑。一、先完成一个基本的 Promise。二、完成 then 方法。
2025-08-20 04:38:43
534
原创 JS 中的 this
在 JS 中,this 作为关键字,它的场景是函数,this 是函数里的内置对象,即它是JS标准中已经定义好的,无需显式创建的,用于指代的对象。1.当 this 所在函数是事件处理函数时,它表示的是事件源。2.当 this 所在函数是构造函数,它表示的是 new 出来的这个实例对象。也就是说当 this 单纯作为代码放在那里时,它是没有实际意义的,只有当这个对象被 new 出来的那一刻,才会赋予其指代的意义。3.当 this 所在函数是类中的方法时,它表示调用这个方法的那个对象。
2025-08-19 18:23:32
388
原创 原型和原型链?
每个都有一个prototype属性,这个属性称之为原型。因为这个属性的值是个对象,所以也称之为原型对象。作用就是:存放一些属性和方法,共享给实例对象使用;在JS中实现继承。为什么实例可以使用原型上的方法?
2025-08-18 05:25:46
310
原创 JS中原型的作用是什么?
简单举个例子,上面是两个对象,它们的结构完全一样,都有一个属性,属性名都是 name。那么在面向对象的系统里面就一定要能记录 Dog 和 Cat 这两个类型,JS中记录类型的手段就是利用原型。给这两个对象各加一个属性 _proto_ ,然后让 _proto_ 指向 xx.prototype,这样就能知道这两个对象是属于哪个类型了。1.强类型语言,比如:Java、C#等都是使用类型元数据进行实现(简单来说就是在内存中开辟一块独立的空间,专门存储整个程序里面各种各样的类型)。它们的目的是一样的,都是为了。
2025-08-17 21:27:37
156
原创 【原生 JS】如何理解事件循环和JS的异步?
具体做法是当某些任务发生时,比如:计时器、网络通信、事件监听。主线程会将这些任务交给其他线程去处理,自身立即结束任务的执行,转而执行后续代码。当其他线程完成时,会将事先传递的。中的很多其他任务无法得到执行。这样一来,一方面会导致繁忙的渲染主线程白白消耗时间,另一方面导致页面无法及时更新,给用户造成卡死现象。中,而渲染主线程只有一个。渲染主线程承担着诸多工作,渲染页面、执行JS都在其中运行。在这种异步模式下,浏览器永不阻塞,从而最大限度保证了单线程的流畅执行。的方式,就极有可能导致渲染主线程产生。
2025-08-17 20:11:57
225
原创 面向对象中的原型
在 JS 中,每个对象都有一个内部属性 [[prototype]] (通过 __proto__ 访问),指向它的原型对象。原型对象也是一个普通对象,它有自己的属性和方法,并且也可以有自己的原型,从而形成原型链。当访问一个对象的属性或方法时,如果对象本身没有该属性或方法,JS 会沿着原型链向上查找,直到找到该属性或到达原型链的末端 (null)。JS 通过原型机制实现了继承,即对象(实例)可以共享原型对象的属性的方法。
2025-02-11 11:53:05
483
原创 【表达式求值算法】拆解复杂问题:实现计算器
表达式求值算法是个 Hard 级别的问题,本次就来解决它。最终实现一个包含如下功能的计算器:1.输入一个字符串,可以包含 + - * / 、数字、括号以及空格,算法返回运行结果。2.要符合运算规则,括号的优先级最高,先乘除后加减。3.除号是整数除法,无论正负都向0取整(5/2=2,-5/2=-2)。4.可以假定输入的算式一定合法,且计算过程不会出现整型溢出,不会出现除数为0的意外情况。
2024-09-24 19:17:09
897
原创 【JavaSE】Java注解
我们最早使用的注解有:方法重写 @Override,在编译期间进行硬性检测,加在方法上就表明该方法是从父类重写过来的。Java 注解(Annotation)又称 Java 标注,它可以用来对类、方法、属性、参数、包等进行标注,然后让编译器或运行时其他类进行解析,完成某个功能,注解也可以编译到字节码文件中。当然它也支持自定义 Java 标注。
2024-09-22 20:14:30
618
原创 【JavaSE】IO模型
IO,英文全称是 Input/Output,翻译过来就是输入/输出。我们听得挺多,就是磁盘 IO,网络 IO 等。IO 即输入/输出,到底谁是输入?谁是输出?IO 如果脱离了主体,会让人疑惑。
2024-09-22 18:29:08
1016
原创 【Java集合】深入了解ArrayList实现原理
1.数据存储是基于动态数组实现的,默认初始容量为10。2.添加数据时,首先需要检查元素个数是否超过数组容量,如果超过了则需要对数组进行扩容(1.5倍);插入数据时,需要将从插入点 k 开始到数组末尾的数据全部向后移动一位。3.数组的扩容是新建一个大容量(原数组大小 + 扩容容量)的数组,然后将原数组的数据拷贝到新数组。数组扩容操作的代价比较高,如果能预估数据量,那么就给 ArrayList 分配一个较大的初始值,可以减少调整大小的开销,ArrayList支持缩容,但不会自动缩容。
2024-09-21 22:06:48
450
原创 【二分搜索】二分搜索代码模板
二分搜索框架下面这首算法小诗出自《labuladong的算法小抄》二分搜索套路歌二分搜索不好记,左右边界让人迷。小于等于变小于,mid加一又减一。就算这样还没完,return应否再减一?信心满满刷力扣,通过比率二十一。我本将心向明月,奈何明月照沟渠!labuladong从天降,一同手撕算法题。管它左侧还右侧,搜索区间定乾坤。搜索一个元素时,搜索区间两端闭。while条件带等号,否则需要打补丁。if相等就返回,其他的事甭操心。mid必须加减一,因为区间两端闭。
2024-09-20 21:36:32
895
原创 【JVM】本地方法接口和执行引擎
简单来讲,一个 Native Method 就是一个 java 调用非 java 代码的接口,。一个Native Method 是这样一个 java 方法:该方法的底层实现由非 Java 语言实现,比如 C。这个特征并非 java 特有,很多其他的编程语言都有这一机制在定义一个 native method 时,并不提供实现体(有些像定义一个 Javainterface),因为其实现体是由非 java 语言在外面实现的。
2024-09-20 18:00:42
800
原创 【JVM】类加载
类加载器子系统负责从文件系统或者网络中加载 class 文件。ClassLoader 只负责 class 文件的加载,至于它是否可以运行,则由 Execution Engine 决定。加载的类信息存放于一块称为方法区的内存空间。class file 存在于硬盘上,可以理解为设计师画在纸上的模板,而最终这个模板在执行的时候是要加载到 JVM 当中的,根据这个模板实例化出 n 个实例 .class file 加载到 JVM 中,被称为 DNA 元数据模板。
2024-09-16 22:38:34
1215
原创 【动态规划】最长递增子序列
动态规划的核心设计思想是数学归纳法。例如,输入 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
737
原创 【JVM】概述
Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三方Java框架(如Spring、MyBatis等)构成。在国内,有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富,相比而言,有关Java虚拟机的资料却显得异常贫乏。这种状况很大程度上是由Java开发技术本身的一个重要优点导致的:在虚拟机层面隐藏了底层技术的复杂性以及机器与操作系统的差异性。
2024-09-15 17:51:25
868
原创 【面向对象】设计模式分类
创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,提供了。
2024-09-15 11:57:48
627
原创 【算法】 滑动窗口—最长无重复子串
我们要的是最长无重复子串,哪一个阶段可以保证窗口中的字符是没有重复的呢?这里和之前不一样,要在收缩窗口完成后更新 res,因为窗口收缩的 while 条件是存在重复元素,换句话说收缩完成后一定保证窗口中没有重复。比如,输入 s = "aabab",算法返回2,因为无重复的最长子串是 "ab" 或者 "ba",长度为2。当 window[c] 值大于1时,说明窗口中存在重复字符,不符合条件,就该移动 left 缩小窗口了。输入一个字符串 s,请计算 s 中不包含重复字符的最长子串长度。
2024-09-15 01:08:46
410
原创 【算法】滑动窗口—找所有字母异位词
比如输入 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
424
原创 【算法】滑动窗口—字符串的排列
比如输入 S = "helloworld",T = "oow",算法返回 True,因为 S 包含一个子串 "owo" 是 T 的排列。输入两个字符串 S 和 T,请你用算法判断 S 是否包含 T 的排列,也就是要判断 S 中是否存在一个子串 是 T 的一种全排列。这明显是关于滑动窗口算法的题目,
2024-09-14 22:28:16
416
原创 【算法】滑动窗口代码模板
这个算法的时间复杂度是O(N),比字符串暴力算法要高效得多。其中两处 sout 表示更新窗口数据的地方,直接往里面填具体逻辑就行了。而且,这两处操作分别是右移和左移窗口更新操作,它们的操作是完全对称的。滑动窗口算法技巧的思路非常简单,就是维护一个窗口,不断滑动,然后更新答案。
2024-09-14 13:35:24
461
原创 【JavaSE】ArrayList、LinkedList和Vector的区别
因为 LinkedList 的每个节点除了存储元素,还要存储两个指针,一个指向前驱,一个指向后继。Vector 和 ArrayList 相似,但属于强同步类,内部由于synchronized 同步关键字的存在,其方法都是同步的,保证了线程安全。如果程序本身是线程安全的,使用ArrayLIst是更好的选择。的新数组,然后将原数组中的数据拷贝到新数组中。如果能预估数据量,那么就给 ArrayList 分配一个较大的初始值,可以减少调整大小的开销,ArrayList支持缩容,但不会自动缩容。
2024-09-09 13:13:11
847
原创 【并发编程】synchronized锁状态和底层实现
锁的状态是通过对象监视器在对象头中的字段来表明的,四种状态会随着竞争的情况逐渐升级。偏向锁、轻量级锁、重量级锁是针对synchronized的状态。这四种状态都不是 Java 语言中的锁,而是 JVM 为了提高锁的获取与释放效率而做的优化(使用synchronized时)无锁:没有任何线程使用锁对象。偏向锁:当前只有一个线程访问,在对象头 Mark World 中记录线程id,下次此线程访问时,可以直接获取锁。
2024-08-19 20:24:56
416
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅