
java
随便写点小代码
这个作者很懒,什么都没留下…
展开
-
mybatis+MySQL 新增数据返回主键id问题
今天遇到个问题,怕自己又忘记,记录一下有个需求,需要存入数据到MySQL后要返回主键id,我按照以前设置的方式得到的结果始终是1,就非常奇怪,找了原因,记录一下int count = userMapper.insert(user);//拿到的是插入成功的数据条数int userId = user.getUserId();//拿到的是保存成功后返回的主键<insert id="insert" useGeneratedKeys="true" keyproperty="userId" paramT原创 2022-03-11 16:36:16 · 3227 阅读 · 0 评论 -
springboot升级log4j2,解决漏洞问题
最近log4j2爆出有重大漏洞问题,公司也紧急要求各个项目自己查验,要求将log4j的版本升到安全版本原创 2021-12-17 12:26:53 · 7368 阅读 · 1 评论 -
求最长回文子串的长度(manacher算法)
【题目】字符串str,求最长回文子串的长度【要求】时间复杂度为O(N)public class Manacher { private static char[] manacherString(String str){ char[] chars = str.toCharArray(); char[] arr = new char[2*chars.length+1]; int index = 0; for (int i = 0.原创 2021-12-01 19:26:59 · 404 阅读 · 0 评论 -
kmp算法
【题目】字符串str1和str2,str1是否包含str2,如果包含,返回str2在str1中的开始位置【要求】时间复杂度为O(N)public class KMP { private static int getIndexOf(String str1, String str2){ char[] arr1 = str1.toCharArray(); char[] arr2 = str2.toCharArray(); int[] next =.原创 2021-11-29 17:25:26 · 142 阅读 · 0 评论 -
并查集java
public class Code04_UnionFind { public static class Element<V>{ public V value; public Element(V value) { this.value = value; } } public static class UnionFindSet<V>{ public HashMap<原创 2021-11-24 18:48:00 · 236 阅读 · 0 评论 -
计算有多少个岛
【题目】一个矩阵中只有0和1两种值,每个位置都可以和自己的上下左右四个位置相连,如果有一片1连在一起,这个部分叫做一个岛求一个矩阵中有多少个岛public class Islands { public static int countIslands(int[][] m){ if (null == m || null == m[0]){ return 0; } int N = m.length; in.原创 2021-11-23 16:04:56 · 123 阅读 · 0 评论 -
哈希结构算法
【题目】设计一种结构满足如下3个功能insert(key):将某个key加入到该结构,做到不重复添加delete(key):将原本在结构中的某个key移除getRandom():等概率随机返回结构中任意key【要求】3个方法的时间复杂度要求O(1)public class RandomPool { public static class Pool<K>{ private HashMap<K, Integer> keyIndexMap; .原创 2021-11-18 16:29:10 · 125 阅读 · 0 评论 -
暴力递归算法例题
汉诺塔打印字符串所有子序列打印字符串的全部排列栈逆序转化数字字符为字符串装下最多价值的物品最后获胜者的分数暴力递归-N皇后问题以及优化声明一下,以上代码均整理自左程云算法课程...原创 2021-11-17 18:59:52 · 155 阅读 · 0 评论 -
最后获胜者的分数
【题目】给定一个整型数组arr, 代表数值不同的纸牌排成一条线。 玩家A和玩家B依次拿走每张纸牌, 规定玩家A先拿, 玩家B后拿, 但是每个玩家每次只能拿走最左或最右的纸牌, 玩家A和玩家B都绝顶聪明。 请返回最后获胜者的分数【 举例】arr=[1,2,100,4]。开始时, 玩家A只能拿走1或4。 如果开始时玩家A拿走1, 则排列变为[2,100,4], 接下来玩家 B可以拿走2或4, 然后继续轮到玩家A…如果开始时玩家A拿走4, 则排列变为[1,2,100], 接下来玩家B可以拿走1或100.原创 2021-11-17 18:39:43 · 299 阅读 · 0 评论 -
装下最多价值的物品
【题目】给定2个长度为N的数组weights和values,weights[i]和values[i]分别代表第i个物品的重量和价值,给定一个正数bag,表示一个载重bag的袋子,泥状的额物品不能超过这个重量,返回能装下最多的价值public class Knapsack { public static int maxValue1(int[] weights, int[] values, int bag) { return process1(weights, values, 0.原创 2021-11-14 20:07:09 · 907 阅读 · 0 评论 -
转化数字字符为字符串
【题目】规定1和A对应,2和B对应,3和C对应,1-26对应26个字母那么一个数字字符串比如“111”,就可以转化为“AAA”,或者是“KA”,或者是“KA”给定一个只有数字组成的额字符串str,问返回有多少种转化结果public class ConvertToLetterString { private static int number(String str){ if (null == str || str.length() == 0){ r.原创 2021-11-14 19:07:31 · 281 阅读 · 0 评论 -
栈逆序java
【题目】在不借助其他数据结构的情况下,逆序栈public class ReverseStackUsingRecursive { private static void reverse(Stack<Integer> stack){ if (stack.isEmpty()){ return; } int i = getAndRemoveLastElement(stack); reverse(stac.原创 2021-11-12 17:26:48 · 828 阅读 · 0 评论 -
打印字符串的全部排列
【题目】打印字符串的全部排列,要求不要出现重复排列(假设全部字符都是小写字母)public class PrintAllPermutations { public static ArrayList<String> permutation(String str) { ArrayList<String> res = new ArrayList<>(); if (str == null || str.length() == 0) .原创 2021-11-11 16:53:37 · 252 阅读 · 0 评论 -
打印字符串所有子序列
【题目】打印一个字符串的所有子序列,包括空字符串public class PrintAllSubsquences { private static void printAllSubsquences(String str){ char[] chs = str.toCharArray(); process(chs,0); } //节省空间 private static void process(char[] chs, int i){ .原创 2021-11-10 16:19:39 · 232 阅读 · 0 评论 -
汉诺塔java
汉诺塔算法将所有的圆盘从最左侧杆移到最右侧杆,借助中间的杆public class Hanoi { private static void hanoi(int n){ if (n>0){ func(n, n, "left" , "right", "mid"); } } private static void func(int i, int j, String left, String right, String m原创 2021-11-09 17:26:16 · 391 阅读 · 0 评论 -
暴力递归-N皇后问题以及优化
在N*N的棋盘上摆N个皇后,要求任意两个皇后不同行,不同列,不在一条斜线上,给定一个整数n,返回n皇后的摆法有多少种。例如:n=1 返回1n=2 返回0n=3 返回0n=8 返回92public class NQueens { public static int num1(int n){ if (n < 1){ return 0; } int[] record = new int[n]; re.原创 2021-11-07 19:12:00 · 233 阅读 · 0 评论 -
贪心算法java
贪心算法最小字典序金条切割问题会议室宣讲次数问题获得最大钱数最小字典序给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字符串拼接起来以后形成的字符串具有最小的字典序public class LowestLexicography { public static class MyComparator implements Comparator<String>{ @Override public int compare(String o原创 2021-11-04 18:10:55 · 254 阅读 · 0 评论 -
前缀树java
一个字符串类型的数组arr1,另一个字符串类型的数组arr2,arr2中有哪些字符是arr1中出现的。arr2中有哪些字符是作为arr1中某个字符串前缀出现的,arr2中有哪些字符是作为arr1中某个字符串的前缀出现的,打印arr2中出现次数最大的前缀public class TrieTree { public static class TrieNode{ public int path; public int end; public Trie.原创 2021-11-03 17:46:15 · 138 阅读 · 0 评论 -
dijkstra算法以及优化
dijkstra算法Dijkstra算法是一种最短路径路由算法,用于计算一个节点到其他所有节点的最短路径无向图,但是必须给出初始节点public class Dijkstra { private static HashMap<Node, Integer> dijkstral(Node head){ HashMap<Node, Integer> distanceMap = new HashMap<>(); HashSet&.原创 2021-11-02 17:35:55 · 639 阅读 · 0 评论 -
prim算法
连通图里的所有顶点,且其所有边的权值之和亦为最小。选择一个点作为开始节点,遍历节点所有的边入优先级队列,选择权重最小的边,判断边的to节点是否已经加入过,如果已经加入过,则继续循环取出优先级队列中的节点,没有加入过,就将节点加入进来,再继续遍历to节点的所有边进入优先级队列,循环这些操作,直到优先级队列全部为空优先级队列,实际就是小根堆,每次取出的都是最小的元素public class Prim { public static class EdgeComparator impl.原创 2021-11-02 17:07:56 · 106 阅读 · 0 评论 -
kruskal算法
kruskal算法假设两点之间的边都有权重,那么将所有点加入成图后,要求所有权重和最小1.将所有边进行排序,由低到高2.所有的节点都是独立的集合3.选择从最小边开始,判断from 节点和to节点是否会形成环,不会,就将to节点加入进来,反之就不加判断两个节点是否会组成环,通过判断他们是否属于同一 个集合即可public class Code04_Kruskal { public static class MySets{ HashMap<Node, List<.原创 2021-11-01 17:56:21 · 153 阅读 · 0 评论 -
创建图java
生成图,可以将一些现有的数据转换成自己熟悉的方式,比如说下面的例子,将二维数组转变成了自己熟悉的图public class CreateGraph{ //matrix[i][0] weight //matrix[i][1] from //matrix[i][2] to public static Graph createGraph(Integer[][] matrix){ Graph graph = new Graph(); for (int i = 0原创 2021-11-01 17:09:47 · 551 阅读 · 0 评论 -
拓扑排序算法
熟悉java项目的同学,我可能会比较容易解释这个概念,在java项目中,一般会用到第三方jar包,而这些jar包可能会依赖其他的jar包,这样就形成了拓扑图。而在拓扑中,必定有一个jar包是不依赖其他任何jar包的,也就是入度为零的源节点,而且jar包不能互相形成循环,否则会出问题。所以拓扑排序适用于有向图,且必有入度为0的节点,不能有环public class TopologySort { private static List<Node> sortedTopology(Grap原创 2021-10-31 20:02:12 · 239 阅读 · 0 评论 -
图的宽度优先遍历以及深度优先比遍历
图,和二叉树类似,只不过二叉树严格一个入点,2个出点。而图则不限制宽度优先遍历1.利用队列来实现2.将源节点依次按照宽度进队列,然后弹出3.每弹出一个结点,就该节点的多有邻接节点放进队列4.不断private void bfs(Node node){ if (null == node){ return; } LinkedList<Node> queue = new LinkedList<>(); HashSet<No.原创 2021-10-31 19:26:31 · 289 阅读 · 0 评论 -
二叉树--初级基础算法题
声明一下,这部分的代码都是根据左程云老师的算法课程整理出来的代码,如果有兴趣的同学可以去B站看相应的算法课程,一定要多敲代码,一定要多敲代码,一定要多敲代码。 重要的事情要说3遍。1. 二叉树的前,中,后序遍历2. 求一棵二叉树的宽度3. 判断是否是搜索二叉树4. 是否是完全二叉树5. 树型动态规划(是否是满二叉树,是否是平衡二叉树,是否是搜索二叉树)6. 二叉树公共节点7. 在二叉树中找到一个结点的后继结点8. 二叉树的序列化与反序列化9. java折纸问题(转化为二叉树问题)..原创 2021-10-29 11:58:11 · 94 阅读 · 0 评论 -
java折纸问题(转化为二叉树问题)
一张纸条,由下向上对折,折痕凹,继续向上折,折痕分别是凹凹凸,以此类推给定一个输入参数N,代表纸条从下向上对折N次,请从上向下打印折痕的方向例如 n=1 凹 n=2 凹凹凸这道题可以转化为二叉树的问题第一次凹第二次 凹凹 凸第三次 凹 凹 凸凹 凸 凹 凸…………………………每次新增的线的凹凸性符合二叉树的规律,这道题可以转化为二叉树的问题来解决,每个父节点对应的都是凹,凸两个子节点,利用中序遍历来打印private void printFoldPa.原创 2021-10-29 11:49:11 · 408 阅读 · 0 评论 -
二叉树的序列化与反序列化
【题目】将一棵树转为字符串存在内存中,再将字符串转换还原成树【扩展】如何判断一棵树是不是另一棵树的子树可以将这个问题转化为一个字符串是否是另一个字符串的子串【思路】二叉树的先序遍历private String serialByPre(Node head){ if (null == head){ return "#_"; } String str = head.value + "_"; str += serialByPre(head.left);原创 2021-10-29 10:23:15 · 88 阅读 · 0 评论 -
在二叉树中找到一个结点的后继结点
【题目】/**在二叉树中找到一个节点的后继节点 * 【题目】 * 现在有一种新的二叉树节点类型如下 * public class Node { * public int vaule; * public Node left; * public Node right; * public Node parent; * * public Node(int vaule){ * this.value = value; * } *原创 2021-10-28 17:19:49 · 270 阅读 · 0 评论 -
二叉树公共节点
【题目】给定二叉树的两个二节点node1,node2,找出这两个节点的最低公共祖先节点【思路】2种情况1.node1是node2的祖先节点或者node2是node1的祖先节点2.node1和node2属于不同的子树【方法一】利用递归private Node lowestCommonAncestor(Node head, Node o1, Node o2){ if (head == null || o1 == head || o2 == head){ return head;原创 2021-10-28 16:49:58 · 365 阅读 · 0 评论 -
基础排序算法
简单排序(选择,冒泡,插入,二分查找)归并排序java堆排序java荷兰问题以及快速排序计数排序和基数排序所有代码都是根据左程云老师的算法课程整理出来的原创 2021-10-27 15:02:55 · 99 阅读 · 0 评论 -
树型动态规划(是否是满二叉树,是否是平衡二叉树,是否是搜索二叉树)
树型动态规划,每次的主要步骤一样,利用递归实现。一般遇到如下情形, 每次只需要获得左子树的信息和右子树的信息,再对得到的信息进行处理,周而复始这样的步骤,就可以使用树型动态规划模式实现功能。满二叉树二叉树,树的深度为k,节点个数为n,满足2^(k-1)==n,即为满二叉树判断是否是满二叉树,可以利用它的特点,遍历出二叉树的深度和节点个数,是否满足公式即可。得到左子树的深度和节点个数,得到右子树的深度和节点个数,对两个子树的深度和节点个数进行处理,得到当前树的深度和节点个数,周而复始,直到递归结.原创 2021-10-27 14:58:32 · 147 阅读 · 0 评论 -
是否是完全二叉树
【题目】判断二叉树是否是完全二叉树【思路】1.如果当前节点有右子节点,但没有左子节点,则不是完全二叉树2.在满足条件一,如果有右子节点,则必然存在左子节点。那么判断当前节点是否有右子节点,如果没有,那么在后面继续遍历的节点中,必定都不存在子节点,也就是说,后面遍历的节点,都是叶子节点,没有孩子节点private boolean isCBT(Node head){ if (null == head){ return true; } LinkedList<Node原创 2021-10-26 17:05:47 · 121 阅读 · 0 评论 -
判断是否是搜索二叉树
搜索二叉树,左边子树小于父节点,右边子树的每个节点大于父节点。标准搜索二叉树不会有相等的节点搜索二叉树进行中序遍历,应该是升序的,利用此特点来进行判断是否是搜索二叉树方式一 递归int preValue = Integer.MIN_VALUE;private boolean checkBST1(Node head){ if (null == head){ return true; } boolean isLeftBST = checkBST1(head.left.原创 2021-10-25 18:39:27 · 226 阅读 · 0 评论 -
求一棵二叉树的宽度
方式一利用hashmap记录每一个节点所在的层,利用队列进行宽度遍历hashmapprivate int getMaxWidth1(Node head){ int curMax = 0; int curLevel = 1; int curWidth = 0; HashMap<Node, Integer> map = new HashMap<>(); map.put(head,1); LinkedList<Node> .原创 2021-10-25 17:40:30 · 135 阅读 · 0 评论 -
二叉树的前,中,后序遍历
二叉树的前,中,后序遍历public static class Node { public int value; public Node left; public Node right; public Node(int value) { this.value = value; }}前序遍历1.递归方式private static void preOrderRecur(Node head){ if (null == head){原创 2021-10-24 19:22:26 · 114 阅读 · 0 评论 -
计数排序和基数排序
计数排序【思路】假设有n个非负数,最大的值为max,新建一个数组bucket,大小为max+1,即可以表示0~max的数字,数组的下标即表示一个数字,数组元素中存放的数字,则表示有多少个和下标相等的数字,假设某一个下标,5,bucket[5]=7,也就是说,5这个数字有7个。最后排列数据,从下标为0开始,依次存入到arr中。private void countSort(int[] arr){ if (null == arr || arr.length < 2){ return;原创 2021-10-22 17:23:48 · 103 阅读 · 0 评论 -
荷兰问题以及快速排序
荷兰问题(一)【题目】给定一个数组arr,和一个数num,请把小于等于num的数放在数组左边,大于num的数放在数组右边。【要求】额外空间复杂度O(1),时间复杂度O(N)private void sort(int[] arr, int left, int right, int num){ int less = left - 1; int more = right + 1; while(left < more){ if (arr[left]<=num){ swap(ar原创 2021-10-21 11:55:55 · 198 阅读 · 0 评论 -
堆排序java
1.堆结构就是用数组实现的完全二叉树结构2.完全二叉树中如果每棵子树的最大值都在顶部就是大根堆3.完全二叉树中如果每棵子树的最小值都在顶部就是小根堆4.堆结构的heapInsert和heapify操作5.堆结构的增大和减少6.优先级队列结构,就是堆结构堆排序先让整个数组都变成大根堆结构把堆的最大值和堆末尾的值交换,然后减少堆的大小以后,再去调整堆,一直周而复始,时间复杂度O(N*logN)堆的大小减小成0之后,排序完成父节点与子节点的关系:左叶子节点:2*N+1,右叶子节点:2*.原创 2021-10-20 17:45:33 · 94 阅读 · 0 评论 -
归并排序java
左边排好序,右边排好序,整体排好序归并排序private void mergeSort(int[] arr){ if (null == arr || arr.length < 2){ return; } mergeSort(arr,0,arr,length-1);}private void mergeSort(int[] arr, int left, int right){ if (left == right){ return; } int mid = left + (原创 2021-10-19 16:53:35 · 83 阅读 · 0 评论 -
异或运算的性质和扩展
0 ^ N = NN ^ N = 01.一个数组中有一种数字出现了奇数次,其他数字出现了偶数次,怎么找到这一个数private int getOddTime(int[] arr){ in odd = 0; for (int i : arr){ odd = odd ^ i; } return odd;}2.一个数组中有两种数出现了奇数次,,其他数都出现了偶数次,怎么找到这两个数【思路】:这边同样也是用异或,除了两种数出现奇数次,其他都是偶数次,那么全部异或,结果必然是和出现奇数.原创 2021-10-18 15:57:36 · 319 阅读 · 0 评论