- 博客(183)
- 收藏
- 关注
原创 springboot使用拦截器时遇到的坑记录
问题出现在request.getInputStream()这一行代码上,http请求的输入流为网络传输的流,jdk在设计的流的时候就假设了流只能读取一次,读取流的时候有一个指针pos、读取后指针往后移动一位,读取完后指向-1。(付一张deepseek回答的截图)项目中需要对某一个controller层的部分接口进行权限控制,如新增、删除、修改、提交、上报等接口,request请求中携带了当前的账户id:accoutId,每个接口含有请求参数信息(body、param、path)。
2025-04-01 15:39:47
332
原创 【设计模式-抽象工厂模式(Java)】
抽象工厂模式-顾名思义就是创建工厂的工厂,属于创建型模式,适用于一类产品有多个厂商这种情况。精灵王国具体工厂@Override@Override@Override兽人王国具体工厂@Override@Override@Override。
2024-10-28 19:46:55
481
1
原创 带子节点的对象拷贝【Java实现】
需要将StaffA中的内容拷贝至StaffB中,使用BeanUtils拷贝时不会拷贝List类型,因此需要递归去拷贝。
2024-07-20 16:48:18
276
原创 Pyhon使用M2Crypto模块实现rsa加密解密
使用python的M2Crypto模块实现rsa的加密和解密,需要提前准备好M2Crypto的安装包,也可以使用pip install M2Crypto --force命令进行安装。注意:加密和解密的算法和padding必须保持一致,否则无法解密。以下脚本会生成公钥和私钥文件。
2024-03-06 16:11:51
697
1
原创 docker容器启动使用桥接模式无法上网问题排查
最近公司在搞CICD持续集成、持续交付,期间遇到过这样一种问题:GitLab Runner配置docker时设置limit=5、request_concurreny=5将任务的执行设置为并发执行,network_mode设置为host模式。这样就会有问题存在了,其中一个任务需要启动PG,在任务并行执行时会存在端口冲突问题导致任务执行失败。当时的解决办法是limit和request_concurrency都设置成1让任务串行执行。
2023-06-05 19:35:14
1656
1
原创 maven打包命令参数详解
Dmaven.repo.local=D:\software\apache-maven-3.5.3\repository :如果持续集成服务器有很多任务,每个任务都会使用本地仓库,下载依赖至本地仓库,为了避免这种多线程使用本地仓库可能会引起的冲突,可以使用-Dmaven.repo.local这样的参数为每个任务分配本地仓库。-U:该参数能强制让Maven检查所有SNAPSHOT依赖更新,确保集成基于最新的状态,如果没有该参数,Maven默认以天为单位检查更新,而持续集成的频率应该比这高很多。
2023-05-25 14:50:19
1655
原创 PostgreSQL中Alter语句可重复执行
PostgreSQL中通过Alter对表的修改不支持IF NOT EXISTS子句来达成可重复执行的。上述sql会报如下错误。
2023-05-25 10:28:26
1189
1
原创 PostgreSQL排序相关问题
工作中在对某一个列表进行降序排序时,发现null值跑到了最前面,按照常理,这不是我们想要的效果。故记录此问题。
2023-04-19 15:23:20
953
1
原创 50.第一个只出现一次的字符
50 第一个只出现一次的字符1 题目描述 在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = "abaccdeff"返回 "b"s = "" 返回 " "2 题目分析 两次遍历,第一次用长度为26大小的数组存储每个字符出现的次数,第二遍遍历找第一个次数为1的字符即可。3 代码public char firstUniqChar(String s) { if (s == null || s.length() == 0
2021-08-15 09:13:57
152
1
原创 49.丑数
49 丑数1 题目描述 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。2 题目分析 动态规划思想:dp[i]表示第i个丑数,从1开始计数,有dp[1]=1,根据丑数的定义我们知道dp数组中每个元素乘2,乘3,乘5都还是丑数。不妨设置三个指针p2,p3,p5,初始时分别指向位置1,表示当前位置
2021-08-15 09:13:30
205
原创 48.最长不含重复字符的子字符串
48 最长不含重复字符的子字符串1 题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。2 题目分析 思路:动态规划思想:定义f(i)表示以第i个字符为结尾的不包含重复字符的子串最长长度。 初始:f(0) = 1; 转移方程:当i没出现过时,f(i) = f(i - 1) + 1当i出现过,先找到与上一个出现过位置
2021-08-15 09:12:29
241
原创 47.礼物的最大价值
47 礼物的最大价值1 题目描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例:输入: [ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物2 题目分析 根据题意,对于每个格子,其可以从上方或者
2021-08-15 09:11:53
126
原创 46.把数字翻译成字符串
46 把数字翻译成字符串1 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"2 题目分析 思想:对于每个元素都有两种情况,第一种单独翻译;第二种
2021-08-15 09:11:25
173
原创 45.把数组排成最小的数
45 把数组排成最小的数1 题目描述 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例:输入: [10,2]输出: "102"2 题目分析考查自定义排序使用情况,具体如下:将nums转化为字符串数组类型,定义一种排序规则(x,y) -> ((x+y).compareTo(y+x)),原则:高位的尽可能小直接StringBuilder相加即可2 代码public String minNumber(int[] nums) {
2021-08-15 09:10:22
219
原创 44.数字序列中某一位的数字
44. 数字序列中某一位的数字1 题目描述 数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。2 题目分析 思路:找规律题。 将数字序列如下划分,很容易将1-9,10-99,100-999,…这些类别,digit表示位数,start表示起始元素,则每个区间元素总数就有如下规律:count = start * 9 * digit解题步
2021-08-15 09:09:49
155
1
原创 43.1~n整数中1出现的次数
43 1~n整数中1出现的次数1 题目描述 输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。2 题目分析求1-n整数中1出现的次数。这是个数学题,对于一个整数n,要找1~n所有的1,可以将某一位固定为1,然后找所有小于该数的排列组合,从最低位往最高位依次找,最终的结果就是1的总数了。具体对于当前位有三种情况:cur = 0,cur = 1, cur > 1,还需要知道当前指向元素的
2021-08-15 09:09:19
122
原创 42.连续子数组的最大和
42. 连续子数组的最大和1 题目描述 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。2 题目分析思路:对于数组nums,动态规划思想;f(i)表示以i结尾的最大连续和,那么对于每个元素都有两种可能:与前面部分组合为一段;单独为一段 f(0) = nums[0] f(i) = Math.max(f(i - 1) + nums[i], nums[i]); 返回dp数组中的最大值即可。优化,将数组去掉,用pr
2021-08-15 09:08:45
98
原创 41.数据流中的中位数
41 数据流中的中位数1 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元
2021-08-15 09:08:00
116
原创 TopK问题的常见两种解法
TopK问题的常见两种解法1 什么是TopK 面试中经常会被面试官这样问到:假设一个数组中有上万个数字,我们要找到第K小(大)或者前K小(大)个数字,这时候应该用什么方法去找? 当然不能傻傻的回答用快速排序然后去找,那么只能收到一封感谢信。2 常见思路 这种场景下常用的思路有两种:基于大顶堆实现时间复杂度O(nlogK)的算法假设我们要找前k小的所有元素,首先将数组中前K个元素加入大顶堆中,然后从第k+1个元素开始将当前元素和堆顶元素比较,把较小者加入堆中(Java中用优先队列
2021-07-27 08:32:26
278
原创 40.最小的K个数
40. 最小的K个数1 题目描述 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。2 题目分析最小的k个数,直观思路就是先排序然后找出前k个,这种解法当然不行,下面介绍两种海量数据中的topK问题思路:1. 用大顶堆:首先将前k个元素加入大顶堆中,然后从第k+1个开始将当前元素和堆顶元素比较,把较小者加入堆中(Java中用优先队列实现,如果不需要自己手动写堆的话)2. 快排partition思想:以基准p
2021-07-27 08:31:31
151
原创 39.数组中出现次数超过一半的数字
39. 数组中出现次数超过一半的数字1 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。2 题目分析 最直观的解法是先排序然后去找数组中间的元素即可,但时间复杂度就是O(nlogn),这里使用摩尔投票法:定义一种投票机制,初始化vote等于0,x=0,遍历数组,当vote等于0时将x更新为当前值,对当前值num和x进行比较,如果相等则vote加1,不相等则减一,循环结束返回x即可。3 代码public int
2021-07-27 08:30:50
151
原创 38.字符串的排列
38. 字符串的排列1 题目描述 输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。2 题目分析字符串的排列问题:全排列,考虑用回溯法,注意需要对重复元素去重(主要方法是对字符数组进行排序,保证每次加入的字符是重复字符中的最后一个)在递归块中做如下判断 if (vis[j] || (j > 0 && vis[j - 1] && s[j - 1] == s[j])) continue;用于限制每
2021-07-27 08:30:21
118
原创 37.序列化二叉树
37. 序列化二叉树1 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。2 题目分析将二叉树编码成一个字符串形式(注:这里序列化按层序遍历进行序列化,剑指Offer中是前序遍历),例: 1 / \
2021-07-27 08:29:46
125
原创 36.二叉搜索树和双向链表
36. 二叉搜索树和双向链表1 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。例:2 题目分析 由于二叉搜索树也是一种排序的数据结构,因此我们只要改变指针指向返回头结点即可。问题是如何维护双向链表的左右指向以及头结点,对于一个节点去同时维护左边和右边显得没有必要,因此我们可以对二叉树进行中序遍历每次只改变当前节点和pre节点之间的指向(即pre.right=cur,cur.left=pre),好了指针指向解
2021-07-27 08:28:54
74
原创 35.复杂链表的复制
35. 复杂链表的复制1 题目描述 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]2 题目分析 根据题目描述可知,该链表除过next指针域还有一个额外的random
2021-07-27 08:27:51
143
原创 34.二叉树中和为某一值的路径
34. 二叉树中和为某一值的路径1 题目描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标target=22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回
2021-07-23 08:40:15
275
1
原创 33.二叉树的后续遍历序列
33. 二叉树的后续遍历1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考下面这颗二叉搜索树: 5 / \ 2 6 / \ 1 3输入: [1,3,2,6,5]输出: true输入: [1,6,3,2,5]输出: false2 题目分析 思路:根据题意,容易看出数组的最后一个元素就是根节点,二叉搜索树的定义又可知左边的小于根节点
2021-07-23 08:38:43
211
原创 32.从上到下打印二叉树
32. 从上到下打印二叉树1 题目描述 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。2 题目分析 用队列就能简单实现,层序遍历3 代码public int[] levelOrder(TreeNode root) { if (root == null) return new int[0]; List<Integer> ans = new ArrayList<>(); // 队列用于层序遍历 Deque<
2021-07-23 08:35:35
98
原创 Deque相关方法详解
Deque相关方法详解1 Deque能干什么? 我们在日常开发中经常会用到队列和栈的数据结构在Java中表示队列和栈的有Queue和Stack,而Stack作为Java的丢弃品已经没人用了。而Deque双端队列这种数据结构就很灵活了,即可以满足队列的FIFO特性,又可以满足栈的LIFO特性,那么分别作为队列和栈Deque该如何使用呢?下一小节将详细说明每一个方法。2 Deque的相关方法方法说明add方法往队列尾部加入元素addFirst方法往队列首部加入元素
2021-07-23 08:35:03
3830
2
原创 31.栈的压入弹出序列
31. 栈的压入弹出序列1 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。2 题目分析贪心思路:将pushed队列中的每个数都push到栈中,同时检查这个数是不是popped序列中下一个要pop的值,如果是则pop出来。最后检查是不是所有该po
2021-07-23 08:33:18
108
原创 前缀和讲解(一维和二维的情况)
前缀和1概念 顾名思义,前缀和就是数组当前位置前的所有位置之和,一般用于动态规划的题中,理解前缀和对某些题就可以直接套用模板来做了。2 初始化 在一维数组中,比如[1, 2, 3, 4]的前缀和树组就是[0, 1, 3, 6, 10];在二维中同理前缀和数组要比给定数组长度大一,这是方便写转移方程。3 应用场景 在一维数组中,常常用于求数组中索引从i到j的总和,sumRange(i, j)= sum[j + 1] - sum[i],即索引i到j的和等于前j + 1个元素的和减去前i个
2021-07-23 08:31:57
278
1
原创 30.包含min函数的栈
30 包含min函数的栈1 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top();
2021-07-23 08:28:16
143
1
原创 29.顺时针打印矩阵
29.顺时针打印矩阵1 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。2 题目分析 没有什么复杂的数据结构,按层去模拟即可。3 代码/* 顺时针打印矩阵:模拟添加即可,需要四个初始遍历left,right,top,bottom分别表示左右上下的界限,画图参考食用最佳按层模拟 */public List<Integer> spiralOrder(int[][] matrix) { List<Integer>
2021-07-21 08:44:29
72
原创 28.对称的二叉树
28. 对称的二叉树1 题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。2 题目分析 空节点和只有一个节点肯定是对称的,然后递归判断左右子节点是否相等即可。3 代码// 递归判断左边的左边和右边的右边是否相等以及//左边的右边和右边的左边是否相等public boolean isSymmetric(TreeNode root) { if (root == n
2021-07-21 08:43:49
130
原创 27.二叉树的镜像
27. 二叉树的镜像1 题目描述 请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4 / \ 2 7 / \ / \1 3 6 9镜像输出: 4 / \ 7 2 / \
2021-07-20 15:55:27
91
原创 26.树的子结构
26. 树的子结构1 题目描述输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \ 1 2给定的树 B: 4 / 1返回 true,因为 B 与 A
2021-07-20 15:54:56
87
原创 25.合并两个排序的链表
25. 合并两个排序的链表1 题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。2 题目分析// 合并两个有序链表,有两种思路,一种是用迭代的思想与遍历,另一个就比较妙了,采用递归思想,代码也及其简单,先看迭代版本的// 二者的时间和空间复杂度都是O(m+n)3 代码// 迭代public ListNode mergeTwoLists1(ListNode l1, ListNode l2) { ListNode yummy = new ListN
2021-07-20 15:54:20
87
原创 24.反转链表
24. 反转链表1 题目描述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。2 题目描述 链表反转很简单,只需要改变指针的指向即可。画一个图就很明显了: 一直移动curr和pre指针,每次使curr.next=pre,然后往前更新直到curr为null时返回pre即可。3 代码public ListNode reverseList(ListNode head) { ListNode pre = null, curr = head; whi
2021-07-20 09:44:22
81
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人