自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM学习四

1、报表异常 | JVM调优有一个报表系统,频繁发生内存溢出,在高峰期间使用时,还会频繁的发生拒绝服务,由于大多数使用者是管理员角色,所以很快就反馈到研发这里。业务场景是由于有些结果集的字段不是太全,因此需要对结果集合进行循环,并通过 HttpClient 调用其他服务的接口进行数据填充。使用 Guava 做了 JVM 内缓存,但是响应时间依然很长。初步排查,JVM 的资源太少。接口 A 每次进行报表计算时,都要涉及几百兆的内存,而且在内存里驻留很长时间,有些计算又非常耗 CPU,特别的“吃”资源。而

2022-06-17 20:52:45 274 1

原创 JVM学习三

1、什么是双亲委派模型?为什么需要双亲委派模型?当一个类加载器收到一个类加载的请求,他首先不会尝试自己去加载,而是将这个请求委派给父类加载器去加载,只有父类加载器在自己的搜索范围类查找不到给类时,子加载器才会尝试自己去加载该类;为了防止内存中出现多个相同的字节码;因为如果没有双亲委派的话,用户就可以自己定义一个java.lang.String类,那么就无法保证类的唯一性。那怎么打破双亲委派模型?自定义类加载器,继承ClassLoader类,重写loadClass方法和findClass方法。2、列举一

2022-06-17 20:26:25 317

原创 JVM学习二

1、Minor GC 和 Full GC 有什么不同呢?Minor GC:只收集新生代的GC。Full GC: 收集整个堆,包括 新生代,老年代,永久代(在 JDK 1.8及以后,永久代被移除,换为metaspace 元空间)等所有部分的模式。Minor GC触发条件:当Eden区满时,触发Minor GC。Full GC触发条件:1、通过Minor GC后进入老年代的平均大小大于老年代的可用内存。如果发现统计数据说之前Minor GC的平均晋升大小比目前old gen剩余的空间大,则不会触发Min

2022-06-17 17:11:08 182

原创 JVM学习一

1、 什么情况下会发生栈内存溢出?1、栈是线程私有的,栈的生命周期和线程一样,每个方法在执行的时候就会创建一个栈帧,它包含局部变量表、操作数栈、动态链接、方法出口等信息,局部变量表又包括基本数据类型和对象的引用; 2、当线程请求的栈深度超过了虚拟机允许的最大深度时,会抛出StackOverFlowError异常,方法递归调用肯可能会出现该问题; 3、调整参数-xss去调整jvm栈的大小2、谈谈对 OOM 的认识?如何排查 OOM 的问题?除了程序计数器,其他内存区域都有 OOM 的风险。1、栈一般经常

2022-06-16 20:43:06 105

原创 键入网址到网页显示,期间发生了什么?

1、浏览器地址栏输入 URL,浏览器解析 URL,从而生成发送给 web 服务器的请求信息。2、浏览器查看浏览器缓存系统缓存路由缓存, 如有存在缓存, 就直接显示。 如果没有, 接着第3步。3、域名解析(DNS)获取相应的 IP。4、浏览器向服务器发起 tcp 连接, 与浏览器建立 tcp 三次握手。三次握手举例,将通信的两端用字母A和B替代。A要往B发数据,A要确定两件事: 1. B在“那儿”,并且能接受数据 —— B确实存在,并且是个“活人”,能听得见 2. B能回应 —— B能发数据,能

2022-05-08 16:56:08 1007

原创 接雨水同类题(LeetCode 821)

821. 字符的最短距离给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。两个下标 i 和 j 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数.示例 1:输入:s = “loveleetcode”, c = “e”输出:[3,2,1,0,1,0,0,1,2,2,1,0]解释:字符 ‘

2022-04-19 10:03:21 175

原创 Integer.parseInt(s)与Integer.valueOf(s)的区别

1、Integer.parseInt(s)多次解析同一个字符串得到的int基本类型数据是相等的,可以直接通过“==”进行判断是否相等。Integer.valueOf(s)多次解析相同的一个字符串时,得到的是Integer类型的对象:如果s字符串对应的整数值在 -128 ~ 127之间,则解析出的Integer类型的对象是同一个对象;如果s字符串对应的整数值不在-128~127之间,则解析出的Integer类型的对象不是同一个对象。不管对象是否相等,对象中的value值是相等的。给你一个正整数 num 。你

2022-04-10 14:57:24 344

原创 Integer类型使用踩坑

最小覆盖子串给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。注意:对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果 s 中存在这样的子串,我们保证它是唯一的答案。示例 1:输入:s = “ADOBECODEBANC”, t = “ABC”输出:“BANC”class Solution { public String minWindow(Strin

2022-04-09 10:51:04 320

原创 前缀和学习(LeetCode 661)

图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。给你一个表示图像灰度的 m x n 整数矩阵 img ,返回对图像的每个单元格平滑处理后的图像 。示例 1:输

2022-03-24 11:30:52 120

原创 字典树学习(LeetCode 720)

给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。示例 1:输入:words = [“w”,“wo”,“wor”,“worl”, “world”]输出:“world”解释: 单词"world"可由"w", “wo”, “wor”, 和 "worl"逐步添加一个字母组成。示例 2:输入:words = [“a”, “ban

2022-03-17 09:15:40 188

原创 模拟题(LeetCode 393)

给定一个表示数据的整数数组 data ,返回它是否为有效的 UTF-8 编码。UTF-8 中的一个字符可能的长度为 1 到 4 字节,遵循以下的规则:对于 1 字节 的字符,字节的第一位设为 0 ,后面 7 位为这个符号的 unicode 码。对于 n 字节 的字符 (n > 1),第一个字节的前 n 位都设为1,第 n+1 位设为 0 ,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 unicode 码。这是 UTF-8 编码的工作方式:Char. number ra

2022-03-14 08:45:58 66

原创 归并排序模板

//归并函数void Merge(int[ A,int low, int mid, int high){ int i = low,j = mid + 1, k; //三个指针,i j是B上的,K是A上的 int[] B = new int[A.length]; //把A复制到B for(k=low;k<=high;k++) B[k]=A[k]; //比较i j的key值,把小的放入A[k] for(k=i;i<=mid&&j<=high;k++){ i

2022-03-07 09:33:54 62

原创 快排学习(LeetCode 215题)

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4提示:1 <= k <= nums.length <= 104-104 <= nums[i] <= 104class Solution { publi

2022-03-06 11:15:52 326

原创 广搜学习(LeetCode 838)

n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:dominoes[i

2022-02-22 08:54:59 328

原创 二分学习(LeetCode 540)

给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。示例 1:输入: nums = [1,1,2,3,3,4,4,8,8]输出: 2示例 2:输入: nums = [3,3,7,7,10,11,11]输出: 10思路分析:成对出现的元素第一个对应的下标总是偶数,第二个对应的下标总是奇数。进行二分搜索的时候,如果当前下标为偶数,则进行nums[i]==

2022-02-14 12:19:15 262

原创 模拟哈希表学习(leetcode 539)

539. 最小时间差给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。示例 1:输入:timePoints = ["23:59","00:00"]输出:1示例 2:输入:timePoints = ["00:00","23:59","00:00"]输出:0 提示:2 <= timePoints <= 2 * 104timePoints[i] 格式为 "HH:MM"思路:使用数组模拟哈希表,一天总共1440分

2022-01-18 09:46:50 164

原创 多路归并排序学习(leetcode 373)

373. 查找和最小的 K 对数字给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。示例 1:输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3输出: [1,2],[1,4],[1,6]解释: 返回序列中的前 3 对数: [1,2],[1,

2022-01-17 09:25:47 349

原创 字符串哈希(leetcode 1044)

最长重复字串给你一个字符串 s ,考虑其所有 重复子串 :即,s 的连续子串,在 s 中出现 2 次或更多次。这些出现之间可能存在重叠。返回 任意一个 具有最长长度的重复子串。如果 s 不含重复子串,那么答案为 “” 。示例 1:输入:s = "banana"输出:"ana"示例 2:输入:s = "abcd"输出:"" 提示:2 <= s.length <= 3 * 104s 由小写英文字母组成我们使用一个与字符串 等长的哈希数组 h[],以及次方数组 p[]。由字

2022-01-17 09:09:14 294

原创 回溯练习(leetcode306累加数)

累加数 是一个字符串,组成它的数字可以形成累加序列。一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。给你一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。说明:累加序列里的数,除数字 0 之外,不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。示例 1:输入:"112358"输出:true 解释:累加序列为:

2022-01-15 09:49:26 136

原创 格雷码生成

n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1)第一个整数是 0,一个整数在序列中出现 不超过一次,每对 相邻 整数的二进制表示 恰好一位不同 ,且第一个 和 最后一个 整数的二进制表示 恰好一位不同给你一个整数 n ,返回任一有效的 n 位格雷码序列 。示例 1:输入:n = 2输出:[0,1,3,2]解释:[0,1,3,2] 的二进制表示是 [00,01,11,10] 。00 和 01 有一位不同01 和

2022-01-09 09:24:58 206

原创 二分学习(只出现一次的数字)

给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。示例 1:输入: nums = [1,1,2,3,3,4,4,8,8]思路:本地的做法很多,这里考虑三种。二分查找:因为数组是有序数组,将数组中的数字每两个分为一组,先找出位于中间的一组,确定这一组的两个数组是否相同。如果这两个数字相同,那么只出现一次的数字一定在它的后面,此时查找它后半部分。如果不同,则检查这一组是不是第一组两个数字不相同的分组。如果是第1组,那么这一组的第1个数字就是只出现

2021-12-19 19:34:26 326

原创 前缀树应用二

设计一个使用单词列表进行初始化的数据结构,单词列表中的单词 互不相同 。 如果给出一个单词,请判定能否只将这个单词中一个字母换成另一个字母,使得所形成的新单词存在于已构建的神奇字典中。实现 MagicDictionary 类:MagicDictionary() 初始化对象。void buildDict(String[] dictionary) 使用字符串数组 dictionary 设定该数据结构,dictionary 中的字符串互不相同。bool search(String searchWord) 给定一个

2021-12-18 20:25:42 68

原创 前缀树的应用

在英语中,有一个叫做 词根(root) 的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。现在,给定一个由许多词根组成的词典和一个句子,需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。需要输出替换之后的句子。示例 1:输入:dictionary = [“cat”,“bat”,“rat”], sentence = “the

2021-12-18 19:48:59 131

原创 前缀树学习

Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word .boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean startsWith(Strin

2021-12-18 09:59:10 64

原创 前缀树学习

替换单词在英语中,有一个叫做 词根(root) 的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。现在,给定一个由许多词根组成的词典和一个句子,需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。需要输出替换之后的句子。示例 1:输入:dictionary = [“cat”,“bat”,“rat”], sentence =

2021-12-15 19:56:04 1349

原创 动态规划学习

三个无重叠子数组的最大和(leetcode 689)给你一个整数数组 nums 和一个整数 k ,找出三个长度为 k 、互不重叠、且 3 * k 项的和最大的子数组,并返回这三个子数组。以下标的数组形式返回结果,数组中的每一项分别指示每个子数组的起始位置(下标从 0 开始)。如果有多个结果,返回字典序最小的一个。示例 1:输入:nums = [1,2,1,2,6,7,5,1], k = 2输出:[0,3,5]解释:子数组 [1, 2], [2, 6], [7, 5] 对应的起始下标为 [0, 3,

2021-12-09 08:46:43 55

原创 二叉树的左、右视图

二叉树的右视图(剑指Offer II 046)给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。输入: [1,2,3,null,5,null,4]输出: [1,3,4]思路:右视图即为二叉树每层最后一个节点class Solution { public List<Integer> rightSideView(TreeNode root) { List<Integer> result = n

2021-12-06 09:59:11 1630

原创 数组模拟哈希表

数组模拟哈希表

2021-12-04 08:06:31 183

原创 动态规划学习(打家劫舍三)

在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1]3/ 2 3\ \3 1输出: 7解释: 小偷一晚能够盗取的

2021-09-24 10:50:39 78

原创 动态规划学习(打家劫舍二)

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻

2021-09-24 09:33:38 58

原创 动态规划学习(打家劫舍一)

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。备忘录解法:每次进行判断,当前可以选择偷

2021-09-24 08:56:39 70

原创 双指针学习(leetcode345)

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。示例 1:输入:"hello"输出:"holle"示例 2:输入:"leetcode"输出:"leotcede"思路:将所有元音字母存入Set集合,声明左指针left,右指针right,从左到右和从右到左同时找元音字母,找到进行交换即可。class Solution { Set<Character> vowels = new HashSet<>(){{ add('a');

2021-08-19 08:04:30 95

原创 动态规划算法学习(leetcode174题)

解法一:记忆化递归如果想要求最小初始值,需要不断的递归从后面往前推。因为这样才能从最后的状态推导出一开始骑士最少需要多少血 int [][]memory; public int calculateMinimumHP(int[][] dungeon) { int m = dungeon.length; int n = dungeon[0].length; memory = new int[m][n]; for(int []row :

2021-08-15 09:44:21 184

原创 区间问题(leetcode56合并区间)

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入:intervals = [[1,4],[4,5]]

2021-07-18 09:03:44 60

原创 Vue父子组件通过props传递数据

父组件通过属性props向下传递数据给子组件,子组件通过事件处理方法处理之后给父组件发送消息。比如,子组件需要某个数据,就在内部定义一个prop属性,然后父组件就像给html元素指定特性值一样,把自己的data属性传递给子组件的这个属性。而当子组件内部发生了什么事情的时候,就通过自定义事件处理方法来把这个事情涉及到的数据暴露出来,供父组件处理。例子如下:父组件把brand数据通过props传递给子组件的brand;子组件内部得到brand的值,就遍历content数组查找相关手机品牌,如果found不为f

2021-07-17 21:11:25 806

原创 前端踩坑(CSS)

在项目开发过程中,遇到了让页面按比例适应大小的问题,然后采用了flex布局方式。Flex 是 Flexible Box 的缩写,意为"弹性布局",我将它与网格布局结合。flex: 1=== flex: 1 1 0。flex: 1是flex-grow = 1(定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大,我这里设置为1), flex-shrink(定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小,我这里设置为1)和flex-basis(给上面两个属性分配多余空间之前, 计算项目是否

2021-07-16 16:12:49 45

原创 二分搜索练习(leetcode1011)

传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。示例 1:输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5输出:15解释:船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示:第 1 天:1, 2, 3, 4, 5第 2 天:6, 7

2021-07-09 08:22:33 64

原创 模幂运算(超级次方leetcode372)

你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。示例 1:输入:a = 2, b = [3]输出:8示例 2:输入:a = 2, b = [1,0]输出:1024方法一: int mod = 1337; int index = 1; public int superPow(int a, int[] b) { int len = b.length; if(len == 0)

2021-07-05 09:19:28 275

原创 递归和迭代学习(leetcode341扁平化嵌套列表迭代器)

给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。示例 1:输入: [[1,1],2,[1,1]]输出: [1,1,2,1,1]解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]方法一:递归(N叉树遍历思想)public class NestedIterator implements Iterato

2021-07-03 09:47:07 77

原创 前缀和学习(leetcode560)

定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。解法一: public int subarraySum(int[] nums, int k) { int len = nums.le

2021-07-02 08:48:09 85

空空如也

空空如也

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

TA关注的人

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