自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 时代峰峻安利康师傅图片

2021-09-12 21:02:09 297 1

转载 Java处理异常中的throw和throws的区别

1.throws1.throws用来声明一个方法可能产生的异常,不做任何处理,而是将异常往上传,谁调用就抛给谁2.throws 可以声明多个,用逗号(,)隔开3.相当于给此异常的出口处4.在方法的扩号后面使用throws声明此方法可能抛出的异常,5.如果调用此方法的地方想要解决此异常,就通过 try-catch捕获并处理此异常。6.若调用此方法的地方不想要解决此异常,就在调用这个方法的方法后面继续声明此异常,7.所到了main方法仍在继续声明异常的话,则此异常最后将交于JVM处理123

2021-08-30 00:12:48 281

原创 Mybatis知识点

MyBatis思维导图1、初识框架技术2、搭建MyBatis环境3、掌握MyBatis的核心API4、掌握MyBatis的核心配置文件:主要用于配置数据库连接和MyBatis运行时所需的各种特性5、掌握SQL映射文件(或者使用自动生成SQL映射文件的插件)6、掌握MyBatis缓存7、Dao上级操作8、掌握动态SQL9、掌握MyBatis框架的优缺点和其使用场合---------------知识点详情1、初识框架技术1.1什么是框架框架(Framework)是一个提供了可重用的

2021-08-19 22:09:54 224

转载 剑指offer

LinkedList003-从尾到头打印链表014-链表中倒数第k个结点015-反转链表016-合并两个或k个有序链表025-复杂链表的复制036-两个链表的第一个公共结点055-链表中环的入口结点056-删除链表中重复的结点Tree004-重建二叉树017-树的子结构018-二叉树的镜像022-从上往下打印二叉树023-二叉搜索树的后序遍历序列024-二叉树中和为某一值的路径026-二叉搜索树与双向链表038-二叉树的深度039-平衡二叉树057-二叉树的下一个结点

2021-08-18 12:47:16 179

原创 Servlet

九. 多个servlet对象之间相互调用规则浏览器一次只能访问一个servlet,但是有些请求需要多个servlet协同处理,导致用户发起多次请求才能得到服务。解决:无论本次请求涉及到多少个servlet,用户只需要发起一次请求就可以得到服务。多个servlet之间调用:重定向请求转发十. 重定向解决方案用户第一次手动访问oneservlet,oneservlet工作完毕后,将twoservlet地址写入响应头中的location属性中,Tomcat把302状态码写入状态行。浏览器收

2021-07-29 23:45:07 62

原创 计算机网络错题知识点

计算机网络错题知识点:IEEE802.3 和以太网相关。不属于交换机攻击的是:目录遍历攻击。交换机攻击:1.VLAN跳跃攻击2.生成树攻击3.MAC表洪水攻击4.ARP攻击5.VTP攻击6.DCHP攻击报文分组交换方式适用于中等或大量随时要传送的负荷路由器改名:全局模式网桥不能阻止广播风暴,可以阻止信道冲突,路由器可以阻止广播风暴网桥工作在数据链路层网桥可以实现不同数据链路层协议的局域网互联。网桥增加了传输时延NET Framework类

2021-07-23 15:28:28 1245

原创 LeetCode 剑指Offer No.9 用两个栈实现队列

思路:既然栈是后进先出,那么栈倒转过来不就是先进先出?我们用设立一个普通栈stack1,当有appendTail操作的时候,就不断在stack1入栈。然后准备一个栈stack2,这个stack2里面保存的顺序和stack1相反,当deleteHead操作时,就不断pop stack2。那么怎么样使stack2里面保存的顺序和stack1相反呢?那就是当deleteHead且stack2为空时,将stack1一个一个出栈并一个一个入栈到stack2。直到stack1为空以后,stack2的栈顶保存的就是.

2021-05-27 14:45:29 51

原创 LeetCode Hot 100 No.72 编辑距离

思路:这道题我们用动态规划的方法做。首先建立一个表。行对应word1,列对应word2。判断两个词的编辑距离,分为3步。比如hors和ros:1.我们首先看他们的结尾是不是一样,如果结尾字母一样,比如hors和ros,那么两个单词的编辑距离就等于都去掉结尾字母的两个词的编辑距离。dis(hors,ros) = dis(hor,ro)。2.如果结尾单词不一样,如hor, ro。 我们先看hor去掉最后一个字母以后,变为ho,假设我们已知ho到ro的编辑距离为d1, 那么此时ho经过d1步变为了.

2021-05-27 11:01:40 82

原创 LeetCode Hot 100 No.128 最长连续序列

思路:这道题我们首先用一个hashset来保存所有元素,进行去重。然后我们从头开始遍历整个数组,每遍历到一个元素,都找从它(假设其值为k)开始,是否存在k+1, k+2,。。。。的连续序列,直到k+n不存在于hashset为止。如果该元素k, hashset中存在k-1,那么就跳过它。因为k及k+1,k+2…一定包含在k-1开始的连续序列中,所以无需再找k的连续序列。class Solution { public int longestConsecutive(int[] nums) { .

2021-05-27 10:03:55 113

原创 LeetCode Hot 100 No.494 目标和

思路:这道题用动态规划的方式做。我们容易知道,这个整数数组nums构成的表达式,最大值应该是sum(nums),最小值应该是-sum(nums)。首先我们建立一个表格,其中每行对应每一个nums中的元素,每列对应着从-sum(nums)到sum(nums)的所有数字。如下所示:其中最左边的一列是其右边黄色的一列对应在nums中的索引。这个表格中的 每一个元素(i,j)代表着用从0~i的nums子列中的元素能找到几种构造方式,使得表达式的值等于 j?比如我们看(0,-1) 它代表用从0~0的nu.

2021-05-27 01:16:31 228

原创 LeetCode Hot 100 No.76最小覆盖子串

思路:用滑动窗口的思路。建立一个min=max_length保存最小字串长度。建立两个指针left 和 right ,一开始都指向字符串开头。然后用一个hashmap (名为window)保存窗口内容(字符—>该字符在窗口内出现的次数)。用一个hashmap保存t内容。进入while循环,当right大于s.length()-1时,退出循环。首先判断窗口内是否刚好涵盖了t(t中的字符是否在窗口内而且还需要t中的每一个字符出现的次数与窗口内对应字符出现的次数相等)。如果没有涵盖t,则righ.

2021-05-22 19:09:05 76

原创 LeetCode Hot 100 NO.32最长有效括号

思路:我们首先用一个栈来进行括号匹配,只不过这个栈内保存的是元素的下标。我们从头遍历字符串,当遍历到开括号的时候就将元素下标入栈。每当我们遍历元素 i 且s(i) 是闭括号的时候,我们就看栈顶对应的元素是否为开括号,然后关键的是我们先将栈顶元素出栈,然后用当前元素的下标 i - 当前栈顶元素,直接可以求出当前最大的连续有效括号长度。如果栈顶元素出栈以后,栈空了,说明从0开始到当前括号全都是连续的有效括号,这时最大连续有效括号的长度就是i +1 。我们设立一个变量记录最大的括号长度,最后返回该变量即可。.

2021-05-22 01:03:19 70

原创 LeetCode Hot 100 No.207 课程表

class Solution { List<List<Integer>> edges; int[] visited; boolean valid = true; public boolean canFinish(int numCourses, int[][] prerequisites) { edges = new ArrayList<List<Integer>>(); for (int i =

2021-05-14 15:12:57 225 1

原创 LeetCode Hot 100 No.208 实现(Trie 前缀树)

首先,前缀树是一个保存关键词的一种数据结构。它每一个节点都有26个子结点,每一个子结点对应一个英文字母,每一个子结点又有26个子结点,如此递归生成。每一个节点都由子结点序列和终止变量isEnd组成。当我们从根节点向下走到一个子结点的时候,这个子结点的isEnd值为true,则表示前缀树中保存了从根节点到该结点的这条路径上所走过的字母组成的单词。那么,我们的插入和查找操作都很简单。对于插入操作,我们从头逐字符遍历要插入的字符串word, 然后从根节点开始不断往下走。每次往后遍历一个字符,在当前节点的子.

2021-05-12 00:15:06 115

原创 LeetCode Hot 100 No.200 岛屿数量

思路:这是一个递归的过程。我们建立另一个和网格同样大小的数组 searched 来记录每一个元素是否被访问过。这个数组初始化默认是全0。设立一个sum变量,初始化为0。我们遍历网格的每一个元素,对每一个元素,如果它是陆地,且没有被访问过,我们先将sum+1 ,然后将它所在的岛屿全部访问一遍。于此同时,将这个岛屿的searched 对应位置置为1,表示该岛屿已经访问过。最后返回sum,即为岛屿的总数量。对某个元素延申访问它所在的岛屿分为以下几个步骤:判断该元素是否被访问过,如果是,直接retur.

2021-05-10 22:40:20 111

原创 LeetCode Hot 100 No.152 乘积最大子数组

思路:首先我们设立一个max 和 min 数组,这两个数组的长度和nums 一致。max[ i ] 和 min [i] 分别表示以nums[ i ] 结尾的连续子数组乘积的最大值和最小值。max[0] = min[0] = nums[0]。max[ i +1] = max( nums[i] , nums[i]* max[i-1], nums[i]*min[i-1]).min[ i +1] = min( nums[i] , nums[i]* min[i-1], nums[i]*max[i-1])..

2021-05-10 22:09:09 89

原创 LeetCode Hot 100 No.139 单词拆分

思路:这道题用动态规划做。比如leetcode这个字符串,我们用一个长度为s.length()+1的布尔型数组isLegal来保存每一个元素的状态。首先将isLegal [0] 置为 true。然后isLegal [ i ] 为true表示从s[0]到s[i-1] 的字符字串是都可以被拆分为一个或多个字典中的单词。isLegal [ i ] = isLegal [ j ] 是否为true && wirdDict.contains (s.substring(j+1,i)) .

2021-05-10 21:47:45 131

原创 LeetCode Hot 100 No.34 在排序数组中查找元素的第一个和最后一个位置

二分查找这里做的题还有点少,以后再补详细的说明把,这里只是把标答照着抄了一遍。class Solution { public int[] searchRange(int[] nums, int target) { //查找第一个小于target的元素 if(nums.length==0) { int[] a = {-1,-1}; return a; } int s .

2021-05-10 21:24:00 65

原创 LeetCode Hot 100 No.31 下一个排列

啥叫字典序?我们注意到,下一个字典序组成的十进制数总是比之前的大,但是大小又是所有大于之前的字典序中的最小的。而且最后一个字典序是完全降序的。如 1532641找到它的下一个字典序其实可以看做一个递归的过程,我们首先看最后一个元素[4],它没有下一个字典序。于是我们看[4,1] 因为这是一个完全降序的序列,所以它也没有下一个字典序。然后我们看[6,4,1] 因为这是一个完全降序的序列,所以它也没有下一个字典序。那么我们接下来就看[2,6,4,1] 这个序列的下一个字典序。因为[2,6,4,1]不.

2021-05-10 20:59:26 97

原创 LeetCode Hot 100 No.581最短无序连续子数组

思路1:直接能想到的就是排序的方法,先将nums排序,再从前往后找到第一个不一样的元素a,从后往前找到第一个不一样的元素b,这两个元素及其中间的元素就为题目所求的连续最短子数组。class Solution { public int findUnsortedSubarray(int[] nums) { int[] sortn = Arrays.copyOf(nums,nums.length); Arrays.sort(sortn); int st.

2021-05-08 22:53:39 195 2

原创 LeetCode Hot 100 No.621 任务调度器

思路:首先我们需要统计出来出现次数最多的任务,先给出现最多的任务排序。如:[A, A, A, A, A, A, B, B, B, C] n=2先给A 排任务,注意冷却时间:再给B排任务:再给C排:所有任务都排好了,我们来计算一下时间:受冷却时间的影响,从第一层到第五层的所有时间块(包括空白)都要算作执行时间。max为A的任务数量=6。这部分的时间为:(max-1)*(n+1) = 5 *3 = 15然后我们来看最后一层,最后一层不需要将冷却时间内的空白时间块算在执行时间内,所以我们.

2021-05-08 18:04:15 159

原创 LeetCode Hot 100 No.124 二叉树中的最大路径和

思路:首先我们先写一个函数maxnodepath,这个函数的作用是返回以某一个节点为根节点时,从该节点到叶子节点的最大路径和。比如例1中,节点1的maxnodepath的返回值为1+3=4。当这个节点为null,则返回0。当这个节点为叶子节点(左子树和右子树都为null),则返回该节点的值。当这个节点不为叶子节点,则返回该节点的值+左右子树的maxnodepath的最大值。但是这样并不能满足我们的要求。我们的要求并不是找出从根节点开始的一条最大路径。如示例2所示,最大路径并不一定要经过根节点。..

2021-04-27 01:03:07 119

原创 LeetCode Hot 100 No.84 柱状图中的最大矩形

思路:如果我们用暴力的解法,无非是找出每一个元素以它的高度向左右延伸所能得到的最大矩形面积。当遇到比它小的元素就停止。所以要求从该元素开始向左右延伸遇到的第一个比他小的元素位置,如例子中的第4个元素(从0开始)2,它左边第一个比它小的元素是1,在第1位。它右边没有比它小的元素,我们也定一个位置,记为6。那么2这个元素向两边延伸所能获得的最大面积就是2*(6-1-1)=8。我们算出来每一个元素向左右延申所能获得的最大面积,然后取最大值返回即为所求。如果用栈的方法,我们分别求每一个元素其左边的第一个比它..

2021-04-23 11:30:52 98

原创 LeetCode Hot 100 No.297 二叉树的序列化与反序列化

思路:示例1所示的二叉树如果用leetcode的标准转换为字符串后,应为[,1,2,3,null,null,4,5,null,null] ,题目中写的其实是省去了开头的逗号和最后两个null的。[,1,2,3,null,null,4,5,null,null] 其实就是二叉树的层序遍历的结果,而且结果中要保存null。我们可以很容易通过队列写出二叉树的层序遍历的结果,保存在字符串中作为序列化的结果输出:public String serialize(TreeNode root) { ..

2021-04-21 18:00:50 253

原创 LeetCode Hot 100 No.42 接雨水

思路:采用栈的方法。大概思路为:建立一个栈,栈内保存元素的值和下标(长度为2的整型数组)。然后建立一个变量Last,用last来记录每次应该减去的水量。初始化将Last置为height[0], 将 { height [ 0 ] ,0 } 入栈。设置一个sum变量来记录可以蓄多少水。sum初始化为0。从前往后遍历height数组,每次遍历到一个元素height [ i ] 就和栈顶元素比较。如果栈顶元素小于当前元素,就说明他们之间可以形成一个水槽。栈顶元素出栈,top = stack.pop()。 .

2021-04-19 22:43:16 110

原创 java多线程:Lock实现生产者和消费者

执行结果如下:import java.util.LinkedList;import java.util.Random;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class ne

2021-04-18 00:18:59 130

原创 LeetCode Hot 100 No.79 单词搜索

思路:这道题用回溯法解决,主要难点在于,每次遍历不能重复遍历已走过路径中的元素,要建立一个map或者和word同等大小的二维数组来记录已经遍历过的元素。而且每次当遍历到的字符和word对应位置的字符不一致时就要及时退出遍历,否则回超时。每次遍历到一个元素之后,继续前进时有四个方向可以选择,上,下,左,右,然后我们还需要判断往上/下/左/右走之后有没有和已走过的路径上的元素重复了,如果重复了就不能走。class Solution { StringBuffer route = new Strin.

2021-04-13 00:06:15 58

原创 LeetCode Hot 100 No.560 和为k的子数组

思路:这道题和之前的路径总和3是一样的,都是求从之前的某个节点到当前节点之间的连续路径的总和是否为某个值。所谓前缀和,就是在记录从路径最初的节点到当前节点的路径上的节点值之和。前缀路径和最适合解决的问题就是求有多少条连续路径总和为k。在一条路径上的先后两个节点之间的连续路径的总和等于后面节点的前缀和-前面节点的前缀和。我们求从路径的起始节点到当前节点之间有多少条总和为k的路径,只需要求出当前节点之前,有多少个节点的前缀路径和等于当前节点的前缀路径和-k就可以了。所以,我们通常都需要建立一个哈希表,键.

2021-04-12 22:42:02 89

原创 LeetCode Hot 100 No.146 LRU缓存机制

思路:首先我们用一个双向链表来作为缓存区。这个双向链表list需要有一个头指针head,一个尾指针last,和一个记录当前长度的变量length。这个双向链表的结点Node有一个指向上一结点的指针last, 还有一个指向下一结点的指针next,还有一个保存当前节点键的变量key,一个保存当前节点键值的变量val。还有,我们要建立一个hashmap来保存当前缓存区中保存的节点的信息。<Integer, Node> 分别对应着每个节点的键和该节点的引用。我们来分析一下,LRU的具体操作该如.

2021-04-11 17:22:43 74

原创 LeetCode Hot 100 No.238 除自身以外数组的乘积

思路:先从左到右遍历,将每一个元素左边所有元素(不包括它自己)的乘积保存下来。再从右往左遍历,将每一个元素右边所有元素(不包括它自己)的乘积保存下来。把这两个数组对应元素相加即为所求。class Solution { public int[] productExceptSelf(int[] nums) { int[] o1 = new int[nums.length]; for(int i=0;i<nums.length;i++) {.

2021-04-10 01:10:05 145

原创 LeetCode Hot 100 No.33 搜索旋转排序数组

思路:采用二分法。首先两个指针i 和 j 分别指向数组头尾。计算中点下标mid。然后比较中点和指针i , j 所在元素的大小。如果中点元素小于指针 i 所指元素,则说明中点前部是非升序的,中点后部一定是升序的(这块不懂就自己写一下试试)。那么我们就判断要找的那个元素是不是在后半部分的升序序列中,如果是,则将 i 指向 mid+1,继续在后半部分查找。若不是,则将 j 指向mid-1,在前半部分继续查找。如果中点元素大于指针 j 所指元素,则说明中点后部是非升序的,中点前部一定是升序的。那么我们就.

2021-04-10 01:06:13 67

原创 LeetCode Hot 100 No.240 搜索二维矩阵

思路:指针从左下角出发。左下角为最后一行最小值处,和第一列最大值处。当指针位置元素大于target时,则说明该行最小值都大于target,target一定不在该行内,将指针上移一格。当指针位置元素小于target时,则说明该列的最大值都小于target,target一定不在该列内,将指针右移一格。指针每次移动,都将target的可能存在的范围缩小一行或者一列,而指针所指的位置始终位于target的可能存在的范围的左下角。最终当指针对应的位置元素值等于target时,说明找到了。当最后指针指向矩阵的外部..

2021-04-10 00:51:30 130

原创 LeetCode Hot 100 No.438 找到字符串中所有字母异位词

思路:如何判断两个等长的字符串是不是字母异位词呢?有两种方法:先将字符串转为字符数组,再用Arrays.sort排序,再转为字符串。如果这两个字符串排序后也一样,那这两个字符串就是字母异位词。第二种方法是首先建立一个长为度26的整形数组,代表每一个小写字母出现的次数。然后把字符串转为字符数组,遍历这个字符数组,每次都将遍历到的字符c减去 ’ a ',然后把整型数组中的c-‘a’ 处元素+1,代表对应的字符出现次数+1。当两个字符串对应的整型数组相同时,说明两个字符串为字母异位词。class .

2021-04-10 00:38:37 109

原创 LeetCode Hot 100 No.101 对称二叉树

思路:首先我们建立一个判断两棵树是否为镜像的递归函数:判断两个根节点是不是一样。不一样则返回false。判断root1的左子树和root2的右子树是不是镜像对称(递归)。判断root1的右子树和root2的左子树是不是镜像对称(递归) 。如果1,2,3步骤都满足要求,则返回true./** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode le.

2021-04-10 00:22:16 94

原创 LeetCode Hot 100 No.11 盛水最多的容器

思路:首先,设置两个指针i, j ,一个在最左边,一个在最右边。每次将 h[ i ] , h[ j ] 中对应着较短的垂线的指针,向内缩进一个。不断移动i , j,直到 i 不小于j 为止。记录每次指针之间的面积,最后输出最大面积。为什么双指针法是对的呢?比如我们现在两个指针指向的h[ i ] < h[ j ]。i 指向的是短板,j 指向的是长板。如果我们固定 i ,向内移动 j,那么因为水槽的面积取决于短板的面积,不管 j 移动到的位置的板多长,水槽的面积只能比以前小。所以,i不动,j无论.

2021-04-08 22:14:26 84

原创 LeetCode Hot100 No.461 汉明距离

思路:第一种方法是先异或,然后统计异或之后的数字二进制中1的个数。class Solution { public int hammingDistance(int x, int y) { int z = x^y; return Integer.bitCount(z); }}第二种方法是,先 int z = x^y; 然后z每次都和z-1做与运算,每次z = z&(z-1) 都会使z中的1减少一个。当z==0的时候,z中的1被消去完了。.

2021-04-08 16:37:19 50

原创 LeetCode Hot 100 No.55 跳跃游戏

思路:设置一个dist变量保存目前能到达的最大距离,从i=0往后遍历到i = nums.length-1(最后一个元素不考虑)。当遍历到的 nums[ i ]下标 i 小于等于dist 时,计算从该位置能到达的最大距离 d = nums[ i ] + i . 如果d>dist ,就将dist 更新为d。例:{ 2,3,1,1,4} dist = 0i = 0 : i<=dist dist = max( i+nums [ i ], dist) = 2i = 1 : i<=.

2021-04-08 15:59:18 80

原创 LeetCode Hot 100 No.406 根据身高重建队列

思路:首先我们将所有的序列按照身高 hi 从大到小排序,身高相同的就按照 ki 从小到大排序。如 [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] 排完序以后就是 [7,0] [7,1] [6,1] [5,0] [5,2] [4,4]建立一个linkedlist,遍历这个序列,每一次都将当前 [hi, ki ] 按照其 ki 作为下标插入列表中。我一开始每次插入都从头开始遍历,去找那个大于等于hi 的个数为ki的位置,后来发现列表中的所有元素都大于等于当前元素,所以就直接.

2021-04-08 00:30:19 91

原创 LeetCode Hot 100 No.49 字母异位词分组

思路:这道题也考虑用哈希表来做,但是没想到字符数组可以排序。字符串转为字符数组以后,是可以进行排序的,排完序的字符数组又可以重新生成一个字符串。这样,字母相同,排列不同的字符串都可以对应同一个排序后的字符串。如:“eat”, “tea”, “ate” 都对应着同一个排序字符串“aet”。我们就把这个排序字符串当作哈希表的键,将这个排序字符串所对应的一系列字母异位词组成的列表作为键值。每次遍历到一个字符串,我们先生成它对应的排序字符串,然后将这个字符串通过哈希表,放入对应的列表中。class Solu.

2021-04-07 23:01:18 94

原创 LeetCode Hot 100 No. 234 回文链表

思路:官方的题解是,先用快慢指针找到中点,然后再将后半部分链表反转。再从两头开始遍历,当不相等的时候就不是回文链表。我的方法是直接转为一个数组,然后找到中点,用中心扩展法来判断。这两个方法的核心都是要先找到中点。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(i.

2021-04-07 21:44:00 95

空空如也

空空如也

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

TA关注的人

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