自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 鸿蒙MVVM模式介绍与使用

最近在学习鸿蒙开发,想到了以前写安卓移动端应用时经常会用到的MVVM架构模式,就想着能不能在鸿蒙开发的过程中也使用一下,在鸿蒙开发文档里找到了https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-mvvm-V5这篇文档,在这篇文档的基础上做了一些深化和总结在应用开发中,UI的更新需要随着数据状态的变化进行实时同步,而这种同步往往决定了应用程序的性能和用户体验。

2024-11-22 09:41:52 1595

原创 鸿蒙开发学习|Promise的介绍与在鸿蒙中的使用

虽然解决异步编程的终极解决方案是async和await,但是它们也是基于Promise封装而来的,不过了解Promise也是很重要的。

2024-11-20 10:38:34 1047

原创 中间件|day1.Redis

在发生意外时可以及时保存数据,以便于在下次启动中恢复Redis从4.0开始引入RDB-AOF混合持久化模式,这种模式是基于AOF持久化构建而来的。用户可以通过配置文件中的“aof-use-rdb-preamble yes”配置项开启AOF混合持久化。原理通过使用RDB-AOF混合持久化,用户可以同时获得RDB持久化和AOF持久化的优点,服务器既可以通过AOF文件包含的RDB数据来实现快速的数据恢复操作,又可以通过AOF文件包含的AOF数据来将丢失数据的时间窗口限制在1s之内。步骤。

2024-08-17 05:00:51 1890

原创 Java Web|day7. Web会话跟踪(cookie与session)

cookie是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

2024-08-17 02:23:19 731

原创 Java Web|day6.MyBatis-Plus

条件构造器注解上编写sql语句。

2024-08-17 02:21:02 1115

原创 Java Web|day5.MyBatis

mybatis缓存,将数据库的查询结果,保存到内存(或者硬盘),以便下次执行相同查询时,不经过数据库,直接从内存中取出结果。

2024-08-17 02:18:20 925

原创 Java Spring|day4.SpringCloud

Eureka是微服务架构中的注册中心,专门负责服务的注册与发现。库存服务、仓储服务、积分服务中都有一个Eureka Client组件,这个组件专门负责将这个服务的信息注册到Eureka Server中。说白了,就是告诉Eureka Server,自己在哪台机器上,监听着哪个端口。而Eureka Server是一个注册中心,里面有一个注册表,保存了各服务所在的机器和端口号。

2024-08-15 05:11:08 807

原创 Java Spring|day3.SpringBoot

告诉Spring boot需要什么功能,它就能引入需要的依赖库起步依赖就是特殊的Maven依赖,利用了传递依赖解析,把常用库聚合在一起,组成几个为特定功能而定制的依赖。

2024-08-15 03:55:28 543

原创 Java Spring|day2.SpringMVC

ajax 全名 async javascript and XML(异步JavaScript和XML)Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。而传统的网页(不使用 Ajax)如果需要更新内容,必需重载整个网页面。

2024-08-15 03:39:10 743

原创 java Spring|day1.Spring基础

IoC(Inversion of Control)是控制反转的意思,这是一种面向对象编程的设计思想。Spring通过IoC容器来管理Bean,我们可以通过XML配置或者注解配置,来指导IoC容器对Bean的管理。因为注解配置比XML配置方便很多,所以现在大多时候会使用注解配置的方式。AOP(Aspect Oriented Programing)是面向切面编程思想,这种思想是对OOP的补充,它可以在OOP的基础上进一步提高编程的效率。

2024-08-15 01:33:10 795

原创 代码随想录训练第三十八天|LeetCode1143.最长公共子序列、LeetCode1035.不相交的线、LeetCode53. 最大子序和、LeetCode392.判断子序列

而是dp[6]。在回顾一下dp[i]的定义:包括下标i之前的最大连续子序列和为dp[i]。那么我们要找最大的连续子序列,就应该找每一个i为终点的连续最大子序列。所以在递推公式的时候,可以直接选出最大的dp[i]。

2024-08-06 04:01:26 869

原创 代码随想录训练第三十七天|LeetCode300.最长递增子序列、LeetCode674. 最长连续递增序列、LeetCode718. 最长重复子数组

为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 要不然这个比较就没有意义了,不是尾部元素的比较那么 如何算递增呢。但dp[i] [0] 和dp[0] [j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;此时细心的同学应该发现,那dp[0] [0]是什么含义呢?

2024-08-06 03:59:41 958

原创 javaI/O|day2. javaI/O模型、 具体I/O流程、 具体模型

用什么样的通道或者通信模式和架构进行数据的传输和接收,很大程度上决定了程序的性能。

2024-08-04 04:50:23 1076

原创 javaI/O|day1.javaI/O流、字节流、字符流、File类

I/O流(Input/Output)流,即输入/输出流,是java中实现输入/输出的基础,他可以方便实现数据的输入/输出操作。在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的,I/O流中针对字节的输入/输出提供了一系列的流,统称为字节流。JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader 和 Writer。

2024-08-04 03:49:33 964

原创 操作系统|day4.Linux、Linux内核、Linux负载、Linux文件存储

内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。负载(load)是linux机器的一个重要指标,直观了反应了机器当前的状态。系统的负载采用的是指数移动平均。

2024-08-04 02:32:39 903

原创 操作系统|day3.锁、I/O多路复用、中断

中断是指CPU在执行当前程序时系统出现了某种状况,使得CPU必须停止当前程序,而去执行另一段程序来处理的出现的紧急事务,处理结束后CPU再返回到原先暂停的程序继续执行,这个过程就称为中断。

2024-08-04 02:12:14 851

原创 操作系统|day2.进程、线程、协程

当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。动态性:进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合,程序加入了时间的概念以后,称为进程,具有自己的生命周期和各种不同的状态,这些概念都是程序所不具备的.并发:指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。

2024-08-04 02:08:28 294

原创 代码随想录训练第三十六天|LeetCode188.买卖股票的最佳时机IV、LeetCode309.最佳买卖股票时机含冷冻期、LeetCode714.买卖股票的最佳时机含手续费

如果i为1,第1天买入股票,那么递归公式中需要计算 dp[i - 1] [1] - prices[i] ,即 dp[0] [1] - prices[1],那么大家感受一下 dp[0] [1] (即第0天的状态二)应该初始成多少,只能初始为0。那么dp[i] [0] = max(dp[i - 1] [0], dp[i - 1] [3] - prices[i], dp[i - 1] [1] - prices[i]);dp[i] [0] 表示第i天持有股票所省最多现金。第0天第二次买入操作,初始值应该是多少呢?

2024-08-04 01:19:15 533

原创 代码随想录训练第三十五天|LeetCode121. 买卖股票的最佳时机、LeetCode122.买卖股票的最佳时机II、LeetCode123.买卖股票的最佳时机III

同样dp[i] [1]取最大的,dp[i] [1] = max(dp[i - 1] [1], prices[i] + dp[i - 1] [0]);那么dp[i] [0]应该选所得现金最大的,所以dp[i] [0] = max(dp[i - 1] [0], -prices[i]);一定是选最大的,所以 dp[i] [1] = max(dp[i-1] [0] - prices[i], dp[i - 1] [1]);从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。

2024-08-02 02:50:36 414

原创 代码随想录训练第三十四天|LeetCode198.打家劫舍、LeetCode213.打家劫舍II、LeetCode337.打家劫舍 III

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:示例 2:提示:Related Topics数组动态规划大家如果刚接触这样的题目,会有点困惑,当前的状态我是偷还是不偷呢?仔细一想,当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。所以这里就更感觉

2024-08-01 02:47:12 464

原创 代码随想录训练第三十三天|LeetCode322. 零钱兑换、LeetCode279.完全平方数、LeetCode139.单词拆分、多重背包、背包总结

背包问题是动态规划里的非常重要的一部分,所以我把背包问题单独总结一下,等动态规划专题更新完之后,我们还会在整体总结一波动态规划。关于这几种常见的背包,其关系如下:通过这个图,可以很清晰分清这几种常见背包之间的关系。在讲解背包问题的时候,我们都是按照如下五部来逐步分析,相信大家也体会到,把这五部都搞透了,算是对动规来理解深入了。确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。

2024-07-31 18:58:27 780

原创 代码随想录训练第三十二天|完全背包理论基础、LeetCode518.零钱兑换II、LeetCode377. 组合总和 Ⅳ、卡码网70. 爬楼梯(进阶版)

细心的同学可能发现,全文我说的都是对于纯完全背包问题,其for循环的先后循环是可以颠倒的!但如果题目稍稍有点变化,就会体现在遍历顺序上。如果问装满背包有几种方式的话?那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。这个区别,我将在后面讲解具体leetcode题目中给大家介绍,因为这块如果不结合具题目,单纯的介绍原理估计很多同学会越看越懵!别急,下一篇就是了!最后,

2024-07-31 02:07:29 897

原创 代码随想录训练第三十一天|LeetCode1049.最后一块石头的重量II、LeetCode494.目标和、LeetCode474.一和零

有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x

2024-07-30 03:15:27 997

原创 代码随想录训练第三十天|01背包理论基础、01背包、LeetCode416.分割等和子集

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图:在看其他情况。状态转移方程 dp[i] [j] = max(dp[i - 1] [j], dp[i - 1] [j - weight[i]] + value[i]);可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。dp[0] [j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

2024-07-28 04:41:41 538

原创 代码随想录训练第二十九天|LeetCode62.不同路径、LeetCode63.不同路径 II、LeetCode343. 整数拆分、LeetCode96.不同的二叉搜索树

那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。从递归公式dp[i] [j] = dp[i - 1] [j] + dp[i] [j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i] [j]的时候,dp[i - 1] [j] 和 dp[i] [j - 1]一定是有数值。这里要看一下递推公式dp[i] [j] = dp[i - 1] [j] + dp[i] [j - 1],dp[i] [j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。

2024-07-24 23:56:57 978

原创 设计模式第三天|设计模式结构型:适配器模式、装饰器模式、代理模式

是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。是为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。代理模式通俗来讲就是我们生活中常见的中介。面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而是的业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。通俗描述:不通过修改源代码方式,在主干功能里面添加新功能使用登录的例子说明AOP。

2024-07-24 00:30:41 1121

原创 代码随想录训练第二十八天|动态规划理论基础、LeetCode509 斐波那契数、LeetCode70.爬楼梯、LeetCode746.使用最小花费爬楼梯

然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。

2024-07-23 14:48:37 615

原创 设计模式第二天|设计模式创建型:工厂模式、抽象工厂模式、单例模式、建造者模式

简单工厂模式其实并不算是一种设计模式,更多的时候是一种编程习惯。简单工厂的实现思路是,定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。工厂方法模式是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。封装一个复杂对象构造过程,并允许按步骤构造。就是将复杂对象的创建过程拆分成多个简单对象的创建过程,并将这些简单对象组合起来构建出复杂对象。

2024-07-22 23:30:32 946 1

原创 代码随想录训练第二十七天|LeetCode56.合并区间、LeetCode738.单调递增的数字、LeetCode968.监控二叉树

例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。那么空节点不能是无覆盖的状态,这样叶子节点就要放摄像头了,空节点也不能是有摄像头的状态,这样叶子节点的父节点就没有必要放摄像头了,而是可以把摄像头放在叶子节点的爷爷节点上。所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。

2024-07-22 18:19:42 665

原创 代码随想录训练第二十六天|LeetCode452. 用最少数量的箭引爆气球、LeetCode435.无重叠区间、LeetCode763.划分字母区间

寻找重复的气球,寻找重叠气球最小右边界,其实都有代码技巧。

2024-07-20 19:43:33 1054

原创 代码随想录训练第二十五天|LeetCode134.加油站、LeetCode135.分发糖果、LeetCode860.柠檬水找零、LeetCode406.根据身高重建队列

这在leetcode上是一道困难的题目,其难点就在于贪心的策略,如果在考虑局部的时候想两边兼顾,就会顾此失彼。一次是从左到右遍历,只比较右边孩子评分比左边大的情况。一次是从右到左遍历,只比较左边孩子评分比右边大的情况。这样从局部最优推出了全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果。

2024-07-20 01:05:45 865

原创 设计模式第一天|了解设计模式、设计模式七大原则

软件设计模式(Software Design Patten),又称设计模式,是一套被反复使用,多数人只晓的,经过分类编目的,代码设计经验的总结.它描述了在软件设计过程中一些不断重复的问题,以及该问题的解决方案.也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用.**其目的是为了提高代码的复用性,代码可读性以及代码的可靠性.**

2024-07-18 23:32:26 858

原创 代码随想录训练第二十四天|LeetCode122.买卖股票的最佳时机II、LeetCode55. 跳跃游戏、LeetCode45.跳跃游戏 II、LeetCode1005.K次取反后最大化的数组和

这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。大家可以看出思路想出来了,代码还是非常简单的。一些同学可能感觉,我在讲贪心系列的时候,题目和题目之间貌似没有什么联系?是真的就是没什么联系,因为贪心无套路!没有个整体的贪心框架解决一系列问题,只能是接触各种类型的题目锻炼自己的贪心思维!贪心的题目如果简单起来,会让人简单到开始怀疑:本来不就应该这么做么?这也算是算法?我认为这不是贪心?

2024-07-18 14:15:06 773

原创 数据库MySQL学习第一天|了解数据库、数据类型、存储引擎、sql语言

数据仓库,软件,安装在操作系统之上作用:存储数据,管理数据。

2024-07-18 03:44:34 1074

原创 代码随想录训练第二十三天|了解贪心算法、LeetCode455.分发饼干、LeetCode376.摆动序列、LeetCode53.最大子序和

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。这么说有点抽象,来举一个例子:例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划的问题在下一个系列会详细讲解。本篇给出了什么是贪心以及大家关心的贪心算法固定套路。

2024-07-17 16:04:04 828

原创 代码随想录训练第二十二天|LeetCode491.递增子序列、LeetCode46.全排列、LeetCode47.全排列 II、LeetCode332.重新安排行程、LeetCode51.N皇后、..

回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下。组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等。

2024-07-17 01:07:49 712

原创 代码随想录训练第二十一天|LeetCode93.复原IP地址、LeetCode78.子集、LeetCode90.子集II

递归调用时,下一层递归的startIndex要从i+1开始(因为是在新的字符串上边进行添加),同时记录段数number要 +1。求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合,排列问题我们后续的文章就会讲到的。从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。区别就是集合里有重复元素了,而且求取的子集要去重。

2024-07-16 01:41:25 628

原创 代码随想录训练第二十天|LeetCode39.组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串

给你一个 无重复元素 的整数数组 和一个目标整数 ,找出 中可以使数字和为目标数 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 的不同组合数少于 个。示例 1:示例 2:示例 3:提示:Related Topics数组回溯题目中的无限制重复被选取,吓得我赶紧想想 出现0 可咋办,然后看到下面提示:1

2024-07-14 15:46:50 1045

原创 代码随想录训练第十九天|回溯算法基础理论、LeetCode77.组合、LeetCode216.组合总和III、LeetCode17.电话号码的字母组合

回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯 (opens new window)。回溯是递归的副产品,只要有递归就会有回溯。所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数。本篇我们讲解了,什么是回溯算法,知道了回溯和递归是相辅相成的。接着提到了回溯法的效率,回溯法其实就是暴力查找,并不是什么高效的算法。然后列出了回溯法可以解决几类问题,可以看出每一类问题都不简单。

2024-07-13 00:21:44 1084

原创 代码随想录训练第十八天|LeetCode669.修剪二叉搜索树、LeetCode108.将有序数组转换为二叉搜索树、LeetCode538.把二叉搜索树转换为累加树、二叉树总结

关于二叉树,你该了解这些!:二叉树的种类、存储方式、遍历方式、定义方式涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,二叉树:找所有路径 (opens new window)也用了前序,这是为了方便让父节点指向子节点。所以求普通二叉树的属性还是要具体问题具体分析。

2024-07-12 02:04:51 1160

空空如也

空空如也

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

TA关注的人

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