- 博客(307)
- 问答 (2)
- 收藏
- 关注
原创 Java SE 23 新增特性
在这两种情况下,即通过 long、float、double 和布尔类型进行 switch 以及使用基元变量进行模式匹配时,与所有新的 switch 功能一样,switch 必须要涵盖所有可能的情况。通过 instanceof 和 switch,我们可以检查对象是否属于特定类型,如果是,则将该对象绑定到该类型的变量,执行特定的程序路径,并在该程序路径中使用新变量。在 JDK 23 之前,下述代码中,Child1的构造函数,只能先通过super构造父类,然后才能初始化子类的 b 这个变量。
2024-09-19 00:06:36 1065
原创 Java SE 22 新增特性
在 Java 17 中,这些 API 被合并为 “Foreign Function & Memory API”(FFM API),直到 Java 18,它一直处于孵化阶段。在 Java SE 11 中,无法执行,因为只支持单个 Java 文件运行,但是到了 Java SE 22,可以支持多个文件源码运行,比如上述两个类,在 Java SE 22 下,可以通过。然而,一旦我们添加更多的 Java 文件,Java 11 中所谓的 "启动单个文件源代码 "机制就不再起作用了。在 Java 19 中,
2024-03-20 00:04:28 852
原创 二叉树路径总和系列问题
定义递归函数递归含义表示:从 node 节点一直到树的叶子节点,preSum 表示 node 之前的节点之和,target 表示目标值。主函数调用就是要的答案。接下来是递归函数的 base case,容易得到接下来是普遍情况,当前节点往右走,或者当前节点往左走,如果任何一个满足条件,就返回 true 表示满足,否则返回 false完整代码如下定义递归函数),如果满足条件,则找到一条满足条件的路径,使得结果之和等于目标值,此时 result 开始收集。
2023-12-26 16:27:47 121 1
原创 相同二叉树和镜面二叉树问题
普遍情况,首先要满足,left 树头节点的值和 right 树头节点的值一样,然后是 left 的左子树和 right 的右子树镜面对称,且 left 树的右子树和 right 树的左子树镜面对称,三个条件同时满足,left 和 right 才镜面对称。思路也很简单,首先,两棵空树是相同的树,只有一棵树是空树,则一定不是相同的树,即。即:如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。除此以外,两棵树的头节点的值相等,才有可能是相同的树。此外,左右子树同时为空的时候,是镜面二叉树。
2023-12-19 23:32:15 105
原创 链表K个节点的组内逆序调整问题
有了上述两个方法,我们可以比较方便实现原题要求,主流程如下。后面不够 6 个节点,所以返回。开始,数够 3 个,所以返回。的空间复杂度实现整个算法。方法也相对比较简单,就是。个位置后的那个节点。
2023-11-27 15:49:40 195
原创 反转链表系列问题
此时 cur 需要做如下操作:把 c , d, e 反转后的头节点获取到,假设为 pre , 在上图中,pre 就是 e 节点,然后 cur 再做如下操作。本题核心依然是反转链表,只是增加了一些变量来记录需要反转链表的头位置和结尾位置,不过需要注意的是,本题的链表开始位置是从 1 开始,所以,如果。该函数表示:反转以 head 为头的链表的前 n 个节点,并返回反转后的链表头节点。节点连接起来,所以递归过程中,需要一直记录反转的部分链表的后继节点,设置一个全局变量。个节点,并返回反转后的头节点,当。
2023-11-23 19:41:45 133
原创 Java SE 21 新增特性
该功能首次在 Java SE 19 中预览,在Java SE 20中发布第二次预览版,在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。该功能首次在 Java SE 17 中预览,在在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。作为本版本的预览功能推出。字符串模板是对 Java 现有字符串字面量和文本块的补充,它将字面文本与嵌入式表达式和模板处理器结合起来,从而产生专门的结果。
2023-09-25 14:12:01 263
原创 算法和数据结构学习中的一些小的工具函数
如果 range 大于这个二进制值,则 num 个二进制位一定表示不了,则。区间中任意一个数 x 的出现的概率是 x,因为上述函数返回的结果要在。表示 num 个二进制位可以表示的最大数是多少,比如。情况下加速求区间和,如果数组可变,则需要使用。区间内才能符合要求,所以概率是。说明:在 Java 语言中,区间内,且我们使用的是。可以用下述方法进行测试。运行,可以得到结果对比。注:前缀和只适合数组。
2023-09-05 10:25:36 233
原创 Java SE 20 新增特性
中,Switch 类型匹配作为预览功能推出,到 Java SE 20 ,这个功能已经是第四次预览版,在 Java SE 17 中,可以通过加强 switch 表达式和语句的模式匹配能力,减少了定义这些表达式所需的模板,此外,switch 中增加了空值的支持。此外,在 Java SE 20 中,移除了对 record 命名模式的支持,在 Java SE 19 中,如下写法是对的。中,Java SE 20 的 record 支持类型推断,例如,定义了如下数据结构。在 Java SE 20 之前,需要这样做。
2023-05-03 20:02:59 776 1
原创 动态开点线段树说明
按顺序遍历这个 arr 数组,最小值 2 被取出,其原始位置是 4,且 4 号位置右侧没有比自己更小的数,接下来在开点线段树中把把 4 号位置的值加1,表示 4 号位置被处理过了,在线段树中查4号位置以后并没有任何标记记录,说明没有比这个数更小的数了,直接设置4号位置的ans值为0。接下来是 1 号位置的 8, 在线段树中,查到右侧有三个标记过的,说明有三个比它小的数,直接在 ans 中把 1 号位置设置为 3, 然后在线段树中把 1 号位置标记为 1 ,说明处理过,此时。
2022-12-28 21:37:51 1320 1
原创 LFU 的设计与实现
此时只有出现一次的桶,接下来,如果 key = C 这条记录 被访问过了,所以词频变为2,接下来要把 key = C 这条记录先从词频为1的桶里面取出来,然后再新建一个词频为 2 的桶,把这个 key = C 的数据项挂上去,结果如下。接下来,如果又操作了 key = C 这条记录,那么这条记录的词频就是 3, 又需要新增一个词频为 3 的桶,原来词频为 2 的桶已经没有数据项了,要销毁,并且把词频为 1 的桶和词频为 3 的桶连接在一起。例如,LFU Cache 在初始为空的状态下,进来如下数据。
2022-12-27 21:50:34 493 1
原创 子数组的最大异或和问题
有了 eor 数组以后,对于任意 i 位置,0 到 i 区间的异或和就可以直接获取到了,接下来是枚举数组中任意两个位置 i 和 j 区间的异或和,由于。eor[2] 期待和它符号位一样为0的值,紧着高位(由于前面28都是0,所以不存在和它符号不一样的,只看最后4位,,整个过程比较简单,不赘述,基于这个暴力解法,可以有优化一些的算法,就是利用前缀异或和数组,时间复杂度可以减少到。当确定了 0 ~ i 位置的异或和以后,如何定位 0 ~ j 这个区间,使得 j ~ i 之间的异或和最大。(i > 0),所以。
2022-12-26 21:54:07 811 1
原创 架构设计(九):估算
估算在系统设计中非常重要,这决定了你的设计是否可以满足要求,要实现比较靠谱的估算,就需要对如下几个概念熟练掌握第一个概念:二的幂尽管在处理分布式系统时,数据量可能是巨大的,但计算都可以归结为基础知识。为了获得正确的计算结果,关键是要知道使用2的幂的数据量单位。一个字节是一个8位的序列。一个ASCII字符使用一个字节的内存(8位)。可参考如下表格第二个概念:关于延时指标的常见场景注:以下指标说明来自,虽然是基于2010年的状况,但是目前这些指标还是有一定的参考价值。
2022-12-25 21:18:34 827
原创 字符串解码问题
递归含义表示,str 字符串从 from 开始一直到结尾或者右边括号生成的信息返回,返回值是一个长度为 2 的数组,例如。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。就可以,对于数字,要处理一个简单的边界条件,即数字不一定是单个整数,可能是多位数,比如。这个字符串,递归函数在执行过程中,遇到第一个右括号的时候,就会结算出两个信息,继续,后续没有]了,所以一直到字符串最后,得到最终的结果。输入:s = “2[abc]3[cd]ef”
2022-12-23 21:50:41 388 1
原创 Linux 常用命令总结
将一个目录中的所有HTML文件复制到目标目录,同时确保仅复制那些目标目录中不存在或是比目标目录中同名文件版本更新的文件。本文基于的 Linux 环境是 CentOS 7, 主要是日常使用的一些命令,持续更新中……假设我们下载了一个被分割成好几部分的文件,希望能将其组合还原。可以使用history命令随时查看命令的历史纪录, 假设输出结果中有这样一行。可以看出,从上到下,越来越多的扩展被禁止。189 是历史记录中该命令的编号,通过。单引号,无引号,双引号的效果。可以立即重新执行这个命令。
2022-12-22 22:52:53 581 2
原创 架构设计(八):数据库的水平扩展和垂直扩展
数据库的扩展有两种方法:垂直扩展和水平扩展。垂直扩展是通过提高现有机器的硬件配置(CPU、硬盘、内存等)来进行扩展。比如,如果使用的是亚马逊的 RDS ,可以得到一个超大内存的数据库服务器,所以在一台数据库服务器,就可以实现存储和处理大量的数据。但是垂直扩展也有一些严重的缺点。虽然可以在数据库服务器上增加更多的 CPU、内存等,但是有硬件的限制,如果用户数量巨大,一台服务器是不够的。单点故障的风险更大。垂直扩展的总体成本很高。如果要配置一个强大的服务器,费用是很高的。垂直扩展的示例图如下。
2022-12-20 20:33:44 2031
原创 架构设计(七):日志、监控和自动化
针对小型网站,日志、监控和自动化支持是很好的做法,但不是必须的。然而,如果网站已经发展到为大型企业服务,日志、监控和自动化工具是必不可少的。日志有助于识别系统中的错误和问题。关于日志,有两种处理方式方式一,在每个单独服务器层面上记录日志;方式二,使用工具将它们汇总到一个集中的服务中,以便于搜索和查看。监控并收集不同类型的指标有助于了解系统的健康状况,一些监控的指标如下主机级指标,例如:CPU、内存、磁盘I/O,等等。汇总级指标:例如,整个数据库层、缓存层等的性能。
2022-12-19 18:42:48 1050 1
原创 架构设计(六):引入消息队列
消息队列是一个支持持久化的组件,数据存储在内存中,支持异步通信。它作为一个缓冲器,分配异步请求。消息队列的基本架构很简单,包含两个部分第一部分:输入服务,称为生产者/发布者,创建消息,并将其发布到消息队列中。第二部分:其他服务或服务器,称为消费者/订阅者,连接到队列,并执行消息所定义的动作。消息队列可以实现服务之间的解耦,成为构建可扩展和可靠的应用程序的首选架构。有了消息队列,生产者可以在消费者无法处理消息时将其发布到队列中。即使生产者不可用,消费者也可以从队列中读取消息。
2022-12-18 17:49:55 525
原创 基于 Spring Cloud 的微服务脚手架
作者:本文主要介绍了基于 Spring Cloud Finchley 和 Spring Boot 2.0.x 版本的微服务脚手架的搭建和关键代码说明,参考了。相关组件和版本架构图如下启动方式,按如下顺序启动测试三个请求,需要带上参数,否则会被拦截器拦截提示无权限。返回返回返回核心代码说明上述三个方法在成功调用之前,都需要做鉴权逻辑用户鉴权部分,实现即可,在preHandle中处理鉴权逻辑。
2022-12-18 07:40:37 1425 1
原创 架构设计(五):有状态服务和无状态服务
无状态的服务在横向扩展服务的过程中,将状态(例如用户会话数据)从服务中移出并将会话数据存储在持久性存储介质中,如关系型数据库或 NoSQL。集群中的每个服务都可以从数据库中访问状态数据。这就是所谓的无状态服务。架构如下有状态的服务和无状态服务不一样,有状态的服务从一个请求到下一个请求都会记住客户数据(状态)。而无状态服务器不保留任何状态信息,架构如下上图中,如果使用有状态服务,用户1的状态数据(比如:会话数据和资料图片)都存储在Server 1中。
2022-12-17 17:41:32 1826
原创 架构设计(四):CDN
CDN 全称 Content delivery network ,即:内容分发网络。CDN 是一个地理上分散的服务器网络,主要用于提供静态内容。如:图片、视频、CSS、JavaScript 文件等。还有一种是动态内容缓存,它可以实现基于请求路径、查询字符串、cookies和请求头的HTML页面的缓存。参考。本文主要介绍 CDN 技术当用户访问一个网站时,离用户最近的 CDN 服务器将提供静态内容。也就是说,用户离 CDN 服务器越远,网站的加载速度就越慢。架构如下整个工作流程如下。
2022-12-16 19:51:30 1141 1
原创 架构设计(三):引入缓存
缓存是一个临时存储区域,如果请求的数据获取代价比较高或者数据的访问频率比较高,则会把响应结果存储在内存中,以便更快速地提供后续请求。每次加载一个新的网页,都要执行一次或多次数据库调用来获取数据。反复调用数据库会大大影响应用程序的性能。缓存可以缓解这个问题,架构如下在收到一个请求后,网络服务器首先检查缓存是否有可用的响应。如果有它有,它就把数据发回给客户。如果没有,它就查询数据库,将响应存储在缓存,并将其发回给客户端。这种缓存策略被称为"读过式缓存"。根据数据的类型、大小和访问模式,还有其他的缓存策略。
2022-12-15 21:11:45 483 1
原创 架构设计(二):数据库复制
在中提到了数据库类型的选择,针对大数据量,高可用的场景,数据库复制是一种比较好的方式,其中多个数据库实例之间可以是主/从关系。主数据库通常只支持写操作。从数据库从主数据库获得数据的副本,只支持读操作。所有修改数据的命令,如插入、删除或更新,必须发送到主数据库。大多数应用要求的读和写的比例要高得多;因此,系统中的从属数据库的数量通常比主数据库的数量多。以下是主/从数据库架构的示例图。以上架构的优势是更好的性能。在主从模式中,所有的写和更新都发生在主节点;而读操作则分布在从节点上。
2022-12-14 20:54:52 559 1
原创 架构设计(一):从单服务器模式到负载均衡设计
单服务器模型是最简单的一种架构,参考如下图用户访问一个 URL,URL 会先到 DNS 服务器进行域名解析,然后返回给客户端一个 IP 地址,客户端会通过这个 IP 地址访问到真正的服务,服务接收到客户端请求以后,返回对应的 HTML 页面,就完成了整个过程。当然,以上是静态页面,相对复杂的应用会配置数据库,架构如下在选择数据库的时候,会涉及数据库选型问题,有两类比较主流的数据库可以选择,即和。关系型数据库也被称为关系型数据库管理系统(RDBMS),关系型数据库以表和行来表示和存储数据。
2022-12-13 20:22:19 897 1
原创 最大正方形问题
在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。表示蓝色区域部分的正方形,基于上述上个位置的值,可以得到。本题思路比较简单,可以定义一个二维数组。,接下来是 base case,第一行和第一列的值很容易可以得到。周围的位置依赖,有如下两种情况。表示的区域是绿色部分的正方形,表示的区域是红色部分的正方形,的规模和原始矩阵的规模一样。有一个很显而易见的结论,如果。变量用于记录全局最大值。考虑普遍位置,如下图。
2022-12-12 18:57:03 469 1
原创 Linux 下的输入输出和重定向示例
Linux 下的输入输出有如下三种形式。Linux 的输入重定向符号是。中只记录了非错误的信息,即。目录不存在,所以执行。
2022-12-11 19:39:32 1163 1
原创 Dijkstra 算法说明与实现
注:Dijkstra 算法必须指定一个源点,每个边的权值均为非负数,求这个点到其他所有点的最短距离,到不了则为正无穷, 不能有累加和为负数的环。生成一个源点到各个点的最小距离表,一开始只有一条记录,即原点到自己的最小距离为0, 源点到其他所有点的最小距离都为正无穷大。代码说明:本题未采用题目给的二维数组的图结构,而是把二维数组转换成自己熟悉的图结构,再进行dijkstra算法。从距离表中拿出没拿过记录里的最小记录,通过这个点发出的边,更新源 点到各个点的最小距离表,不断重复这一步。
2022-12-10 18:10:27 657 1
原创 数组分成两个最接近集合问题
以上暴力递归可以改成动态规划,由于递归函数的可变参数有两个,一个是 i,一个是 rest,且其变化范围是固定的,所以可以定义一个二维数组来存所有的递归过程值,递归含义表示:数组 arr 从 i 开始,一直到最后,随意选取进行累加,得到的最接近 rest 且较小的集合的累加和。其中 p1 表示:不选取 i 位置的值进行累加,得到的最接近 rest 且较小的集合的累加和。表示:选取了 i 位置的值进行累加,得到的最接近 rest 且较小的集合的累加和。,否则选取之后,会得到较大的那个集合的累加和。
2022-12-09 21:47:47 907 1
原创 最大值减去最小值小于或等于 num 的子数组数量问题
达标,则 arr 中内部的任何一个子数组都达标;不达标,则 arr 扩充后肯定也不达标;根据题目意思,我们可以得到如下三个结论。利用滑动窗口算法,我们可以得到。完整代码如下(含对数器)
2022-12-08 16:14:08 804 1
原创 二叉树的最小(大)深度问题
结论是:如果Y左树的最右节点是 A(非 X ),Y 必定是第 9 层,如果 Y 左树的最右节点是 X,那 Y 在第 X 层数-Y 的左树的右节点的个数。给定一个二叉树,找出其最小深度,最小深度是从根节点到最近叶子节点的最短路径上的节点数量,说明:叶子节点是指没有子节点的节点。如果 head 的左树为空,则最小深度就是右树的最小深度加1(这里的加1就是包含头节点);如果 head 的右树为空,则最小深度就是左树的最小深度加1(这里的加1就是包含头节点);为头的二叉树的最小深度为多少。
2022-12-07 17:39:14 506 2
原创 二叉树最大路径和问题
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径 至少包含一个 节点,且不一定经过根节点。递归含义表示:head 为头的二叉树,得到的 Info 信息是什么。给你一个二叉树的根节点 root ,返回其 最大路径和。整合成以 head 为头的树的信息,路径和 是路径中各节点值的总和。其中以 head 为头的树的。,这种情况暗示左右子树汇报的。方法的实现,有如下几种情况。以上两种情况都可以归结为。以 head 为头的树的。接下来找左右子树的信息。,这种情况暗示右子树的。
2022-12-06 20:36:14 386 1
原创 纸条折痕问题
此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。递归含义表示:从第 i 次折叠后,纸条从上到下的布局是如何,其中 N 是固定参数,表示 N 次折叠,down 变量表示是否是凹折痕,初始状态调用。本题主要是发现整个过程的规律,假设中间分割线看成是一个二叉树的头结点,分割线的上方看成是左子树,分割线的下方看成是右子树,则有如下规律。表示:从第一次折叠开始,折叠了 N 次,纸条的状态怎么样。
2022-12-05 17:01:37 465
原创 求二叉树中最大的二叉搜索子树的头节点
作者:Grey原文地址:博客园:求二叉树中最大的二叉搜索子树的头节点CSDN:求二叉树中最大的二叉搜索子树的头节点定义递归函数递归含义表示:以为头的二叉树中最大的二叉搜索子树的头结点是什么。接下来是 base case,定义一个辅助函数,这个函数表示:如果以为头的树是二叉搜索树,则返回其大小,否则返回 0。的实现思路也比较简单,即通过中序遍历收集以 head 为头的树,如果这个树满足二叉搜索子树,则返回二叉搜索子树的大小,如果以 head 的头不是二叉搜索树,直接返回 0。代码如下实现了如上方法,主函
2022-12-04 21:38:21 520 1
原创 判断二叉树是否为满二叉树
作者:Grey原文地址:博客园:判断二叉树是否为满二叉树CSDN:判断二叉树是否为满二叉树使用公式,求二叉树的层数 k, 结点数 n,如果满足,则为满二叉树。定义数据结构其中表示二叉树的层数,表示二叉树的结点个数。定义递归函数递归含义是:head 为头的二叉树的层数和点数都是多少,接下来就是 base case即:的时候,此时, 且 接下来是普遍情况方法2定义如下数据结构其中表示是否为满二叉树,表示二叉树的高度。定义了这个数据结构后,可以梳理可能性,如果以 为头的树要符合满二叉树。则需要同时满
2022-12-03 17:23:26 1143
原创 CentOS Linux 的安装
本安装说明是基于 Windows 10 下 VMware workstation 16 安装 Linux,Linux 版本是 CentOS 8,需要保证在联网环境下安装。然后系统会自动安装,安装好了以后,有个 Reboot 按钮,点击 Reboot 按钮,等待系统重启完毕即可,CentOS 安装完成。在CD/DVD这里,选择使用ISO映像文件,选择对应的CentOS的iso文件。做好如上配置后,点击 Install, 即可安装。重启网卡服务,注:Centos 8 不再使用。注:如无vim,可以执行。
2022-12-02 18:50:30 941
原创 Linux 中的文件简单说明
命令指定在建立文件时预设的权限掩码。权限掩码是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。系统启动相关的文件,如内核,initrd,以及grub(bootloader)用户的家目录,每一个用户的家目录通常默认为:/home/USERNAME。伪文件系统,跟硬件设备相关的属性映射文件。执行上面的指令后,输出信息如下:0022。可变化的文件,比如:日志文件,数据文件。查看当前权限掩码,则输入下面的命令。本文基于 CentOS 7。注意:在上面的输出信息中,
2022-12-01 16:53:29 444
空空如也
Visual Studio Code可否配置成Intellij IDEA的如下快捷操作?
2022-07-19
CentOS下定时任务没有正确执行
2021-08-28
TA创建的收藏夹 TA关注的收藏夹
TA关注的人