自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 事务中使用saveAndFlush 而不要使用save

在并发下,判断数据库中是否存在,存在则修改,不存在则新建,若使用save会导致存在单条数据多次保存的情况。

2024-07-22 09:54:11 124

原创 高并发下的缓存失效问题

1. 缓存穿透缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义.风险:利用不存在的数据进行攻击,数据库瞬时压力增大,最终导致崩溃解决:null结果缓存,并加入短暂过期时间2. 缓存雪崩缓存雪崩:缓存雪崩是指在我们设置缓存时key采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

2022-01-08 20:26:11 296 2

原创 [剑指offer刷题] AcWing 50. 序列化二叉树

思想递归, 暴搜题目请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。数据范围树中节点数量 [0,1000]。样例你可以序列化如下的二叉树8/ 12 2/ 6 4为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"注意:以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。java代码/

2021-12-24 19:37:10 237

原创 [剑指offer刷题] AcWing 48. 复杂链表的复刻

思想 (链表, 模拟题)该题的解法分为3步,如下图所示:## 题目请实现一个函数可以复制一个复杂链表。在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。注意:函数结束后原链表要与输入时保持一致。数据范围链表长度 [0,500].代码/** * Definition for singly-linked list with a random pointer. * class ListNode { * int val;

2021-12-24 15:12:27 241

原创 [剑指offer刷题] AcWing 46. 二叉搜索树的后序遍历序列 (递归、树)

思路什么是二叉搜索树可以看出,在二叉树中:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树;没有键值相等的节点。题目是判断一个序列是不是某二叉搜索树的合法的后序遍历序列递归 + 树的后序遍历模拟题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。数据范围数组

2021-12-19 21:06:32 740

原创 [剑指offer刷题] AcWing 45. 之字形打印二叉树(模拟,栈的应用)

思路分层层次遍历在每一层结束后,向队列中加入一个null之字型打印在每次转换层时,对level中的结果反转题目请实现一个函数按照之字形顺序从上向下打印二叉树。即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。数据范围树中节点的数量 [0,1000]。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]8/ 12 2/ 6 4输出:[

2021-12-18 15:20:32 562

原创 [剑指offer刷题] AcWing 42. 栈的压入、弹出序列(栈,模拟)

思路判断栈的输入序列核输出序列是否匹配,只需分为以下几步:判断当前栈顶元素和下一个要输出的栈是否一样的;如果是一样的,必然要弹出;如果不一样,必然将下一个元素入栈题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列 1,2,3,4,5是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2就不可能是该压栈序列的弹出序列。注意:若两个序列长度不等则视为并不是一个栈的

2021-12-18 15:11:17 91

原创 【剑指offer刷题】AcWing 41. 包含min函数的栈(模拟题,队列和栈的应用)

思路使用两个栈就能很好的解决了题目设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素数据范围操作命令总数 [0,100].样例MinStack minStack = new MinStack();minStack.push(-1);minStack.push(3);minStack.push(-4);minStack.getM

2021-12-18 15:01:56 251

原创 [PAT刷题] 1476. 数叶子结点

题目家庭关系可以用家谱树来表示,给定一个家谱树,你的任务是找出其中没有孩子的成员。输入格式第一行包含一个整数 N表示树中结点总数以及一个整数 M表示非叶子结点数。接下来 M行,每行的格式为:ID K ID[1] ID[2] … ID[K]ID是一个两位数字,表示一个非叶子结点编号,K 是一个整数,表示它的子结点数,接下来的 K 个 ID[i]也是两位数字,表示一个子结点的编号。为了简单起见,我们将根结点固定设为 01。所有结点的编号即为 01,02,03,…,31,32,33,…

2021-12-15 17:37:38 128

原创 [PAT刷题] AcWing 1482. 进制 (二分、进位制相关问题)

思路模拟题,二分查找、进位与进制问题题目给定一对正整数,例如 6 和 110,此等式 6=110是否成立?答案是可以成立,当 6是十进制数字,110是二进制数字时等式得到满足。现在,给定一个正整数数对 N1,N2,并给出其中一个数字的进制,请你求出另一个数字在什么进制下,两数相等成立。输入格式输入共一行,包含四个正整数,格式如下:N1 N2 tag radixN1和 N2 是两个不超过 10 位的数字,radix 是其中一个数字的进制,如果 tag 为 1,则 radix 是 N

2021-12-11 11:07:24 477

原创 【PAT刷题】AcWing 1501. 回文数(高精度加法,个位保存在下标0)

思路高精度加法vector<int> add(vector<int> &a, vector<int> &b){ vector<int> c; for (int i = 0, t = 0; i < a.size() || i < b.size() || t; i++) { int s = t; if (i < a.size()) s += a[i];

2021-12-11 09:27:07 168

原创 [PAT刷题] AcWing 1500. 趣味数字(高精度加法)

思想C++中常见的数据范围:int: -2 * 10e9 ~ 2 * 10e9long long: -9 * 10e18 ~ 9 * 10e18高精度加法核心代码for (int i = 0; i < a.size(); i++) { int s = a[i] + a[i] + t; b.push_back(s % 10); t = s / 10;}题目请注意,数字 123456789 是一个 9 位数字,完全由 1 到 9组成,没有重复。将其加

2021-12-09 20:50:02 259

原创 【剑指offer刷题】40. 顺时针打印矩阵

思路就是模拟找规律题:按照,右下左上的规律遍历题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。样例输入:[[1, 2, 3, 4],[5, 6, 7, 8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]java代码class Solution { public int[] printMatrix(int[][] matrix) { int res[] = {}; int n = m

2021-12-07 20:32:44 187

原创 【剑指offer刷题】Acwing 39. 对称的二叉树

思路递归:判断左右子树是否对称 --> 左右儿子相等或者都为空退出条件:true: 左右节点都为空false: 左右节点的值不相等题目请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。样例如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树:1/ 2 2/ \ / 3 4 4 3如下图所示二叉树[1,2,2,null,4,4,3,nul

2021-12-07 20:06:10 603

原创 【剑指offer刷题】38. 二叉树的镜像(递归)

思路递归的题都好有意思递归:交换左右结点退出条件:当前节点为null题目输入一个二叉树,将它变换为它的镜像。样例输入树:8/ 6 10/ \ / 5 7 9 11[8,6,10,5,7,9,11,null,null,null,null,null,null,null,null]输出树:8/ 10 6/ \ / 11 9 7 5[8,10,6,11,9,7,5,null,null,null,null,null,null,null,null]java代码/**

2021-12-07 19:34:01 307

原创 [剑指offer刷题] Acwing 36 合并两个排序的链表(双指针)

36 合并两个排序的链表思路单纯的双指针,容易想,简单java代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode merge(ListNode l1, ListNode l2

2021-12-07 19:21:49 564

原创 [剑指offer刷题] AcWing 35. 反转链表 (简单、双指针、递归)

题型:双指针、递归可以用双指针来写,这个比较容易想,也比较简单也可以用递归的方式去解决,注意递归编程的思考方式题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思考题:请同时实现迭代版本和递归版本。样例输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULLjava代码递归解法/** * Definition for singly-linked list.

2021-11-30 09:49:48 3138

原创 [剑指offer刷题] AcWing 34. 链表中环的入口结点 (双指针、快慢指针)

题型:双指针(快慢指针)如图所示,当快指针和慢指针第一次相遇时(假设在c点相遇),我们让慢指针退回到b点,即往回退y距离;此时快指针退回的距离是2y。此时慢指针刚好走到b点时,快指针走到c’点,c’点与c点关于b点对称,c’b = y, ac’ = 2x。可以得到,圈的长度为x + y。知道了圈的长度为 x + y 。那么只需要在慢指针走到圈的起点时,让快指针再向前走x距离,即能到达圈的起点。可以得出结论,在快慢指针第一次相遇时。让慢指针再次回到起点,重新开始走,当快慢指针再次相遇时,此时相遇的

2021-11-27 21:24:34 4319 1

原创 [剑指offer刷题] Acwing 33. 链表中倒数第k个节点

题型:双指针思路,两个指针间隔k,当后一个指针到达末尾时,前一个指针所指即为正确答案。题目输入一个链表,输出该链表中倒数第 k个结点。注意:k >= 1;如果 k大于链表长度,则返回 NULL;样例输入:链表:1->2->3->4->5 ,k=2输出:4java代码/** * Definition for singly-linked list. * public class ListNode { * int val; * L

2021-11-27 19:49:01 294

原创 [剑指offer刷题] 32. 调整数组顺序使奇数位于偶数前面

题型:双指针思路比较简单,和快排类似。题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序。使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。样例输入:[1,2,3,4,5]输出: [1,3,5,2,4]java代码class Solution { public void reOrderArray(int [] array) { int pre = 0, last = array.length - 1; while (pre &l

2021-11-27 19:34:06 4076

原创 [剑指offer刷题] 31. 表示数值的字符串(普通题)

题型: 普通题没有使用特殊的算法,只是单纯的分类讨论分类讨论首先去点开头结尾的空格若以 +, -开头则去掉得到新的字符串s若s为空,或者s为单个点,则返回false开始循环,循环变量为i,设置dot和e分别记录 . e/E出现的次数若第i个字符为数字,则不做任何处理;若第i个字符为.,则将dot加一,并判断dot是否大于1,e是否大于0,若是则返回false若第i个字符为e/E,则e++,判断e前面和后面是否均为整数。若i等于0,或者i等于长度减1,或者i-1处为点则返回false其

2021-11-26 11:38:59 90

原创 [剑指offer刷题] 30. 正则表达式匹配 (动态规划)

分类:动态规划状态表示和状态转移方程比较难想。闫式DP状态表示:f[i][j]表示p从j开始到结尾,是否能匹配s从i开始到结尾状态转移:如果p[j+1]不是通配符'*',则f[i][j]是真,当且仅当s[i]可以和p[j]匹配,且f[i+1][j+1]是真; 如果p[j+1]是通配符'*',则下面的情况只要有一种满足,f[i][j]就是真; 1. f[i][j+2]是真; 2. s[i]可以和p[j]匹配,且f[i+1][j]是真;第1种情况下的状态转移很好理解,那第2种情况下的状态

2021-11-25 21:35:16 56

原创 [Acwing算法基础] AcWing 902. 最短编辑距离(动态规划)

分类:动态规划题目给定两个字符串 A 和 B,现在要将 A 经过若干操作变为 B,可进行的操作有:删除–将字符串 A中的某个字符删除。插入–在字符串 A的某个位置插入某个字符。替换–将字符串 A中的某个字符替换为另一个字符。现在请你求出,将 A变为 B至少需要进行多少次操作。输入格式第一行包含整数 n,表示字符串 A的长度。第二行包含一个长度为 n的字符串 A。第三行包含整数 m,表示字符串 B的长度。第四行包含一个长度为 m的字符串 B。字符串中均

2021-11-19 11:07:56 84

原创 [剑指offer刷题] AcWing 28. 在O(1)时间删除链表结点

分类:脑筋急转弯删除当前节点即使用下一个节点的数据覆盖当前节点并删除下一个节点题目给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。假设链表一定存在,并且该节点一定不是尾节点。样例输入:链表 1->4->6->8删掉节点:第2个节点即6(头节点为第0个节点)输出:新链表 1->4->8java代码/** * Definition for singly-linked list. * public class ListNode { *

2021-11-18 17:09:37 375

原创 [剑指offer刷题] 27.数值的整数次方(快速幂)

分类:快速幂快速幂的算法思想如下图:题目实现函数double Power(double base, int exponent),求base的 exponent次方。不得使用库函数,同时不需要考虑大数问题。只要输出结果与答案的绝对误差不超过 10−2即视为正确。注意:不会出现底数和指数同为0的情况当底数为0时,指数一定为正样例1输入:10 ,2输出:100样例2输入:10 ,-2输出:0.01java代码(快速幂)class Solution {public:

2021-11-18 16:50:01 676

原创 [剑指offer打卡] 26. 二进制中1的个数(lowbit操作)

输入一个 32 位整数,输出该数二进制表示中 1的个数。注意:负数在计算机中用其绝对值的补码来表示。样例1输入:9输出:2解释:9的二进制表示是1001,一共有2个1。样例2输入:-2输出:31解释:-2在计算机里会被表示成11111111111111111111111111111110,一共有31个1。lowBit返回 x的二进制数的最后为 1的后面的数如 100100返回 100, 十进制直接返回十进制class Solution { public int Nu

2021-11-15 23:12:47 102

原创 [剑指offer刷题] 25. 剪绳子

小学奥数题给你一根长度为 n 绳子,请把绳子剪成 m 段(m、n 都是整数,2≤n≤58 并且 m≥2)。每段的绳子的长度记为 k[1]、k[2]、……、k[m]。k[1]k[2]…k[m]可能的最大乘积是多少?例如当绳子的长度是 8时,我们把它剪成长度分别为 2、3、3 的三段,此时得到最大的乘积 18。样例输入:8输出:18/** * 一个数学题 N > 0, N = n1 + n2 + ... + nk * 反证法: * 1. 假设 ni >= 5, 3

2021-11-11 21:38:49 188

原创 [剑指offer刷题] 24. 机器人的运动范围

地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。一个机器人从坐标 (0,0)的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。但是不能进入行坐标和列坐标的数位之和大于 k的格子。请问该机器人能够达到多少个格子?样例1输入:k=7, m=4, n=5输出:20样例2输入:k=18, m=40, n=40输出:1484解释:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因

2021-11-11 21:37:03 114

原创 [剑指offer刷题] 23. 矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。注意:输入的路径不为空;所有出现的字符均为大写英文字母;样例matrix=[[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]]str=“BCCE” , return “true”str=“AS

2021-11-11 21:32:56 57

原创 [剑指offer打卡] 22. 旋转数组的最小数字

这题考察的二分class Solution { public int findMin(int[] nums) { if (nums.length == 0) return -1; int n = nums.length - 1; while (n > 0 && nums[n] == nums[0]) n--; if (nums[n] >= nums[0]) return nums[0]; i

2021-11-07 21:52:09 63

原创 [剑指offer打卡] 20. 用两个栈实现队列

暴力做法 is OKclass MyQueue {public: /** Initialize your data structure here. */ stack<int> st, b; MyQueue() { } /** Push element x to the back of queue. */ void push(int x) { st.push(x); }

2021-11-05 21:55:42 61

原创 [剑指offer打卡]19. 二叉树的下一个节点

19. 二叉树的下一个节点 主要思想分为两步:如果有右子树,则为右子树的最左侧如果没有右子树,则一直往父亲节点上找,直到当前节点不是父亲节点的右子树为止。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode *father; // 帮助我们快速找到后继节点 *

2021-11-05 21:33:03 71

原创 [剑指offer打卡] 18. 重构二叉树

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; * * 递归分治 */class Solution {public: map<int, int&gt

2021-11-04 21:22:11 1974

原创 [剑指offer打卡] 15.二维数组中的查找

class Solution {public: bool searchArray(vector<vector<int>> array, int target) { // 先判断是否为空 if (array.size() == 0 || array[0].size() == 0) return false; int i = 0, j = array[0].size()

2021-11-02 17:56:56 390

原创 [剑指offer打卡] 13. 找出数组中重复的数字

题给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。注意:如果某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,则返回 -1;样例给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。返回 2 或 3。解答要求:O(1)的空间复杂度思想就是:遍历并将遍历到的数字放到它应该在的地方去,然后再看当前的位置是不是在该在的

2021-06-23 18:29:22 185

转载 [Acwing算法基础] 1.1 快速排序和二分查找

链接:https://www.acwing.com/blog/content/277/来源:AcWing快速排序void quick_sort(int q[], int l, int r){ if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i ++ ; while (q[i] < x);

2021-06-18 11:14:44 104

原创 [Acwing算法基础] 2.8 堆

down 操作将当前节点与子节点中的最小值交换如果此时的节点不是最小编号,则继续这个操作// down操作void down(int u){ int t = u; // 看看有没有左儿子,如果存在则t等于左儿子 if (u * 2 <= s && h[u * 2] < h[t]) t = 2 * u; if (u * 2 + 1 <= s && h[u * 2 + 1] < h[t]) t = u * 2

2021-06-09 16:15:22 90

原创 [Acwing算法基础] 2.6 Trie树

Trie树的应用场景高效地存储和查找字符串集合地数据结构Trie树的思想思想见下面的例子,显而易见,就不用文字描述了一个Trie树的例子核心代码Trie树的存储插入代码void insert(char str[]){ int p = 0; for (int i = 0; str[i]; ++i) { int u = str[i] - 'a'; // 如果p点不存在u这个子节点则创建

2021-06-09 15:30:37 115

原创 [Acwing算法基础] 2.4 单调队列

单调队列应用场景单调队列的典型应用场景:滑动窗口求最值。例Acwing 154 滑动窗口单调队列思想以单调增队列为例,在元素入队之前先将其与队尾元素相比较:若元素大于队尾元素,则入队若元素小于队尾元素,则删除队尾元素。重复1,2步核心代码 for (int i = 0; i < n; ++ i) { scanf("%d", &a[i]); if (i - k + 1 > q[hh]) ++ hh;

2021-06-02 11:41:21 160

原创 [Acwing算法基础] 2.3 单调栈

单调栈的应用场景单调栈主要有三个应用:参考文章应用一:找到每个元素后面比它大的第一个数:例Acwing 830单调栈应用二:视野问题:例:牛的视野应用三:接水问题例 leetcode 42. 接雨水单调栈思想下图是一个递增单调栈,在元素入栈前,先将其与当前的栈顶元素比较:若当前元素大于栈顶元素,则入栈若当前元素小于栈顶元素,则弹出栈顶元素,并重复1, 2步核心代码for (int i = 0; i < n; ++i){ int x; scanf("%d"

2021-06-02 10:57:45 80

空空如也

空空如也

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

TA关注的人

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