正则表达式匹配
力扣 10. 正则表达式匹配题目说明给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
提示:
0 <= s.length <= 20
0 <= p.length <= 30
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
保证每次出现字符 * 时,前面都匹配到有效的字符
示例示例 1:
123输入:s = "aa" p = "a"输出:false解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:
123输入:s = "aa" p = "a*"输出:true解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a' ...
初识设计模式
引入想必大家都知道,在面向对象中,存在着三大特性和五大原则:
三大原则
封装
继承
多态
五大原则
单一职责原则(Single Responsibility Principle)
开放封闭原则(Open-Close Principle)
里氏替换原则(the Liskov Substitution Principle)
依赖倒置原则(the Dependency Inversion Principle)
接口分离原则(the Interface Segregation Principle)
今天,我们的主角不是面向对象,而是设计模式,在设计模式中同样也存在着六大原则,和上述的五大原有着重复:
六大原则
单一职责原则,实现类要职责单一;
开闭原则,要对扩展开放,对修改关闭;
里氏替换原则,所有引用父类的地方必须能透明地使用其子类的对象;
依赖倒置原则,要面向接口编程,不要面向实现编程;
接口隔离原则,使用多个专门的接口,而不使用单一的总接口,即调用方不应该依赖那些它不需要的接口;
迪米特原则,只与你的直接朋友交谈,不跟“陌生人”说话,要降低耦合。
下面我们来一一解释。 ...
颜色分类
力扣 75. 颜色分类题目说明给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
提示:
n == nums.length
1 <= n <= 300
nums[i] 为 0、1 或 2
示例示例 1:
12输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]
示例 2:
12输入:nums = [2,0,1]输出:[0,1,2]
示例 3:
12输入:nums = [0]输出:[0]
示例 4:
12输入:nums = [1]输出:[1]
笔者理解此题是一道数组算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现我们可以将 2 和 0 放在该在的位置,1 的位置自然也就确定了,让我们来看看具体如何实现的吧。
实现123456789101112131415161718192021222324252627282930class Solution { / ...
验证二叉搜索树
力扣 98. 验证二叉搜索树题目说明给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
提示:
树中节点数目范围在[1, 10^4] 内
-2^31 <= Node.val <= 2^31 - 1
示例示例 1:
12输入:root = [2,1,3]输出:true
示例 2:
123输入:root = [5,1,4,null,null,3,6]输出:false解释:根节点的值是 5 ,但是右子节点的值是 4 。
笔者理解此题是一道 BST 算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,直接使用了二叉搜索树的性质进行求解,让我们来看看具体如何实现的吧。
实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748/** * Definitio ...
什么是红黑树
引入红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在 O(log n) 时间内做查找,插入和删除,这里的 n 是树中元素的数目,这代表着它是牺牲编程效率提升性能的数据结构的代表。
在面试时,红黑树相关的问题也屡见不鲜,比如:红黑树的特性和优势,在什么情况需要变色,什么情况需要旋转?下面就对这些问题进行解读,要了解红黑树,我们需要先了解二叉查找树(Binary Search Tree)。
二叉查找树二叉查找树(BST),又称二叉排序树,亦称二叉搜索树。它是数据结构中的一类,在一般情况下,查询效率比链表结构要高。
定义:
一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值; ...
合并区间
力扣 56. 合并区间题目说明以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
提示:
1 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4
示例示例 1:
123输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
123输入:intervals = [[1,4],[4,5]]输出:[[1,5]]解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
笔者理解此题是一道数组算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,先进行了排序,然后依次比较选择填入,让我们来看看具体如何实 ...
路径总和
力扣 112. 路径总和题目说明给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
叶子节点 是指没有子节点的节点。
提示:
树中节点的数目在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
示例:示例 1:
12输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true
示例 2:
12输入:root = [1,2,3], targetSum = 5输出:false
示例 3:
12输入:root = [1,2], targetSum = 0输出:false
笔者理解此题是一道二叉树算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,也采用了递归的方式,不过需要注意的是题目要求的是根节点到叶子节点的路径和,所以一定注意计算时要计 ...
翻转二叉树
力扣 226. 翻转二叉树题目说明
翻转一棵二叉树。
示例:输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
笔者理解此题是一道二叉树算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,采用了递归翻转左右子树的方式,让我们来看看具体如何实现的吧。
实现123456789101112131415161718192021222324252627282930313233343536/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * ...
Spring和SpringBoot的常用注解
引入传统的Spring做法是使用 xml 文件来对 bean 进行注入或者是配置切面、事物,这么做有两个主要的问题:1、如果所有的内容都配置在 xml 文件中,那么 xml 文件将会十分庞大;如果按需求分开 xml 文件,那么 xml 文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低。2、在开发中在 java 文件和 xml 文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率。为了解决这两个问题,Spring 引入了注解机制,通过”@XXX”的方式,让注解与 java bean 紧密结合,既大大减少了配置文件的体积,又增加了java bean的可读性与内聚性。
Spring 常用注解@Autowired@Autowired 顾名思义,就是自动装配,其作用是为了消除代码 Java 代码里面的 getter/setter 与 bean 属性中的 property 。当然,getter 看个人需求,如果私有属性需要对外提供的话,应当予以保留。
@Autowired 默认按类型匹配的方式,在容器查找匹配的 bean,当有且仅有一个匹配的 bean时,Spr ...
跳跃游戏
力扣 55. 跳跃游戏题目说明给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
提示:
1 <= nums.length <= 3 * 10^4
0 <= nums[i] <= 10^5
示例示例 1:
123输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
123输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
笔者理解此题是一道数组算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,采用了贪心的策略,每次向后前进时都尽量多攒步数,让我们来看看具体如何实现的吧。
实现123456789101112131415161718192021222324252627class Solution { ...








