- 博客(265)
- 问答 (1)
- 收藏
- 关注
原创 LeetCode 103. 二叉树的锯齿形层序遍历
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。BFS+双端队列class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); List<List<Inte
2021-07-28 02:18:55
336
原创 写一个 sql,查询一个班级里各科分数最高的学生信息
写一个 sql,查询一个班级里各科分数最高的学生信息select b.* from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score用一句SQL查出所有课程成绩最高和最低的学生及其分数select b.,“最高分” from (select subject,max(score) m from grade GROUP BY subjec
2021-07-19 17:48:38
12392
原创 InnoDB和MyISAM的区别
innoDB和MyISAM的区别:InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的, 但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应
2021-07-19 17:47:48
301
原创 B树和B+树详解
B树定义:m阶B树是一颗平衡的m路搜索树,需满足以下条件: 1.树中每个节点最多有m个孩子 2.除了根节点和叶子节点外,其它节点至少有(m + 1)/ 2个孩子 3.如果根节点不是叶子节点,最少有两个孩子 4.所有叶子节点都在同一层 5.除了叶子节点,每个节点关键字个数 = 孩子个数 - 1 6.非叶子节点关键字有序,指针指向范围在左右关键字内的子树B树优点:相对于B+树,如果经常访问的数据离根节点很近,而B树非叶子节点存储关键字数据的地址,检索速度优于B+树B+树定义:m阶B
2021-07-19 17:43:06
833
原创 进程和线程的区别
进程和线程的区别:进程:一个在内存中运行的应用程序,拥有自己独立的一块内存空间,一个进程内可以有多个线程,操作系统资源分配的基本单位,进程之间切换开销大线程:进程中的一个执行任务(控制单元),一个进程至少有一个线程,多个线程可以共享进程中的堆和方法区资源,每个线程拥有独立的程序计数器,虚拟机栈,本地方法栈,线程是处理器任务调度和执行的基本单位,线程之间切换开销小...
2021-07-19 17:41:47
103
原创 数据库中char和varchar的区别
数据库中char和varchar的区别:char:定长,char(n)中的n是字符数,最大为255,char在存储时会去掉尾部空格varchar:不定长,varchar(n)中的n是字节数,最大65535
2021-07-19 17:41:01
519
原创 Java中的线程
java线程1.创建线程的方式:继承Thread类,实现runnable接口,实现callable接口,线程池2.run和start的区别:start方法用来启动线程,此时线程处于就绪状态,并没有运行。run方法包含了此线程的执行内容,此时线程处于运行状态,执行run方法中的代码,run方法结束,线程终止,cpu再调度其它线程。3.几种线程池:newCachedThreadPool:会重用线程池中的线程,如果当前没有可用线程,会创建一个新线程加入池中,如果池中有线程60s未处于活动状态会被终止
2021-07-19 17:39:39
76
原创 jdk1.7 ConcurrentHashMap详解(源码+注释)
浅析结构在jdk1.7中ConcurrentHashMap整体上可以看作是一个双层数组的结构。外层是Segment数组,数组的每个Segment在操作时都相对独立,在加锁的过程中只会对某个Segment加锁而不是整个数组。每个Segment内是一个HashEntry数组,类似于一个HashMap。//无参构造器会用默认参数调用该构造器 //参数为默认的初始容量,加载因子,并发级别 initialCapacity==16,loadFactor==0.75f,concurrencyLevel==16
2021-07-15 17:55:20
762
原创 LeetCode 剑指 Offer 45. 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。定制排序+快排x + y < y + x 则 x < y(字符串拼接)class Solution { public String minNumber(int[] nums) { String[] strs = new String[nums.length]; for(int i = 0; i < nums.length; i++)
2021-07-13 21:57:47
224
原创 LeetCode 剑指 Offer 46. 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。动态规划dp[i] 代表到当前字符有多少种翻译数当第i位字符和第i - 1位字符可以翻译成字符串时,dp[i] = dp[i - 1] + dp[i - 2]反之dp[i] = dp[i - 1]class Solution { public int transl
2021-07-13 21:47:43
79
原创 浅拷贝和深拷贝
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。...
2021-07-08 19:06:33
83
原创 String
1.两个字符串相加是否是新的实例:是的。两个字符串相加会通过创建一个StringBuilder来实现,append两个字符串用toString来返回。2.StringBuffer用append方式,对象是否会发生变化会的。append会调用父类AbstractStringBuilder中的append方法,如果拼接后的字符串长度大于当前容量,会先尝试2倍+2的容量能否满足,不满足则创建拼接后字符串大小的数组并将字符串复制过来,如果拼接后的字符串长度小于当前容量,则直接复制到数组中。...
2021-07-08 19:06:03
139
原创 MySQL事务隔离级别以及MVCC(多版本并发控制机制)
1.隔离级别:读未提交:脏读(读取其它事务未提交的数据),不可重复读,幻读读已提交:不可重复读(一个事务的两次读取数据出现不同的结果,主要是修改操作),幻读可重复读:幻读(一个事务的两次读取数据出现不同的结果,主要是添加和删除操作)可序列化:串行操作,每个读取的数据行加上共享锁2.MVCC:当前读:基于悲观锁的实现,读到的是最新版本的数据,且会对数据上锁快照读:基于MVCC的实现,不会对读取的内容上锁,提高并发性能,可能会读到数据的旧版本MVCC模型:为了实现读-写冲突不加锁,这个读就是指快
2021-07-08 19:05:29
279
原创 MySQL索引
索引的类型:B-Tree索引, 哈希索引, 空间数据索引(R-Tree), 全文索引索引的优点:1.减少服务器需要扫描的数据量2.帮助服务器避免排序和临时表3.可以将随机I/O变为顺序I/O高性能索引策略:1.前缀索引:索引很长的字符串时可以索引开始的部分字符(会降低索引的选择性:不重复的索引值和数据表记录总数的比值)2.选择合适的索引列顺序:将选择性更高的列放在前面3.聚簇索引:一种数据存储方式,InnoDB的聚簇索引在同一个结构中保存了B-Tree的索引和数据行,数据行实际存放在索引的
2021-07-08 19:03:12
94
转载 TCP的三次握手与四次挥手
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时.
2021-07-06 21:39:18
94
原创 死锁的解除
死锁的解除:1.抢占资源:从其它进程中抢占足够的资源分配给死锁进程,直至死锁解除2.终止进程:终止所有死锁进程逐步终止死锁进程同时检测当前系统是否还处于死锁状态(根据进程的优先级,进程已运行时间以及完成还需要的时间,进程已占用的资源,完成进程还需要的资源等等判断先终止哪个进程)...
2021-07-06 20:38:15
376
原创 SpringBoot使用手册
SpringBoot入门官网文档架构查看新版本特性:https://github.com/spring-projects/spring-boot/wiki#release-notes入门配置maven设置<mirrors> <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>
2021-07-06 20:37:51
1948
1
原创 死锁的检测
死锁的检测:实现算法:需要记录可利用资源向量,每个进程的已分配资源,每个进程的请求资源原理:标记所有没有死锁的进程1.标记所有已分配资源全为0的进程2.查找一个下标i,满足i是未标记且进程i每个请求资源都能被可利用资源满足,若找不到,结束算法3.若找到了某个i,将其标记,并将其已分配资源返还到可利用资源中,重复步骤2...
2021-07-06 19:58:22
213
原创 如何避免死锁
如何避免死锁:1.预防死锁–针对死锁的必要条件进行预防破坏占有且等待条件,一次性申请进程所需要的所有资源。改进:允许进程只获得运行初期的资源,在运行过程中逐步释放使用完毕的资源,申请需要的资源。破坏不可抢占条件:当一个进程申请需要的资源没有被满足时,释放掉所占有的所有资源。破坏循环等待条件:给每个资源编号,当一个进程占有某个资源时,只能申请比这个编号大的资源2.避免死锁–在分配资源之前判断是否会出现死锁若一个进程的请求会导致死锁,则不启动。若一个进程的增加资源会导致死锁,则不启动。实现:银行
2021-07-06 19:57:55
6793
原创 死锁的四个必要条件
死锁的四个必要条件:1.互斥:一个资源一次只允许一个进程访问2.占有且等待:一个进程占用资源的同时,需要等待另一个进程释放的资源3.不可抢占:一个进程不能抢占其它进程所拥有的自己需要的资源4.循环等待:存在一个进程链,每个进程都占有着下一个进程所需要的资源...
2021-07-06 19:57:19
130
原创 LeetCode 剑指 Offer 44. 数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。找规律先确定所在数字是几位数然后确定在该位数区间的第几个数最后确实是这个数的第几位class Solution { public int findNthDigit(int n) { int digit = 1; long start = 1;
2021-07-06 19:52:56
81
原创 LeetCode 剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。摩尔投票维护候选众数class Solution { public int majorityElement(int[] nums) { int num = 0, votes = 0; for(int n : nums){ if(votes == 0) num = n;
2021-07-06 18:55:10
66
原创 LeetCode 剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。dfs + 剪枝dfs每一位字符的所有情况,通过和后面的字符交换实现用set去除当前位字符与待交换字符可能的重复class Solution { char[] c; List<String> res; public String[] permutation(String s) { c = s.toCharArray(); re
2021-07-04 21:34:57
60
原创 LeetCode 剑指 Offer 36. 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向中序遍历满足递增顺序用一个额外的pre变量记录前一个节点class Solution { Node pre, head; public Node treeToDoublyList(Node root) { if(root == null) return null; inOrder(root); hea
2021-07-04 20:44:19
54
原创 LeetCode 剑指 Offer 34. 二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。DFS遍历在遍历过程中记录路径上的节点值并将target减去当前节点当到叶子节点且target为0时 加入答案集合中注意在递归之后要删掉对应节点 保持递归前后的一致性class Solution { List<List<Integer>> results; List<Integer> result; publi
2021-07-02 21:50:33
186
2
原创 BFPRT算法
在partition的基础上对选择划分点的优化,将不确定的随机划分转化为可以确定的范围,进而确定了O(N)的时间复杂度在bfprt算法中,pivot点的求法:1.将数组划分为五个一组2.求出每组的中位数3.在由中位数组成的数组中,求出其中位数作为pivot点在此pivot点的划分下,可以确定小于pivot点的数至多有几个,通过大于pivot点的数至少有几个求得。方法:在中位数组成的数组中有n/10规模的数大于pivot点,而这n/10规模的数在自己的小组中又有2个数大于自己,所以共有至少3n/10
2021-07-01 21:09:00
94
原创 LeetCode 剑指 Offer 33. 二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。方法一 递归判断从i到j范围上是否满足左孩子节点小于根 右孩子节点大于根递归左子树和右子树方法二 单调栈将后序遍历倒过来即为中右左的顺序单调递增栈用来维护右孩子节点若当前元素小于栈顶元素栈顶元素出栈并作为当前相对根节点则之后的元素应作为该相对节点的左孩子若大于当前相对根节点 则不满足条件class Solution { public
2021-07-01 19:52:14
62
原创 LeetCode 剑指 Offer 32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。利用队列实现按层遍历class Solution { public int[] levelOrder(TreeNode root) { if(root == null){ return new int[0]; } Queue<TreeNode> queue = new LinkedList<>(); List<I
2021-06-22 21:35:31
57
原创 LeetCode 剑指 Offer 31. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。用压入和弹出序列模拟操作过程若最后栈为空 说明两个序列对应class Solution { public boolean validateStackSequences(int[] pushed, int[]
2021-06-22 21:25:59
164
原创 LeetCode 剑指 Offer 42. 连续子数组的最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。动态规划dp[i]代表以i结尾的最大子数组的和若dp[i - 1] > 0, dp[i] = dp[i - 1] + nums[i],否则 dp[i] = nums[i]class Solution { public int maxSubArray(int[] nums) { int[] dp = new int[2]; int res =
2021-06-21 19:27:52
101
原创 LeetCode 剑指 Offer 40. 最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。大根堆维护前k小当堆的大小比k大时 弹出堆顶元素class Solution { public int[] getLeastNumbers(int[] arr, int k) { PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<
2021-06-21 18:29:55
66
原创 LeetCode 剑指 Offer 35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。在原链表上进行复制后再拆分class Solution { public Node copyRandomList(Node head) { if(head == null){ return null; } Node cur = head;
2021-06-20 20:43:59
59
原创 LeetCode 剑指 Offer 18. 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意被删除的节点可能是头节点class Solution { public ListNode deleteNode(ListNode head, int val) { ListNode cur = head; ListNode pre = null; if(head.val == val){ return head.next;
2021-06-20 20:21:06
65
原创 LeetCode 剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。class Solution { public ListNode reverseList(ListNode head) { if(head == null){ return null; } ListNode pre = null; ListNode cur = head; while(cur != null){
2021-06-20 20:16:55
62
原创 LeetCode 剑指 Offer 19. 正则表达式匹配
请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。动态规划当p为空时,当且仅当s为空,两字符串匹配当p不为空时,需要继续判断若p当前字符不为,当且仅当p当前字符匹配s当前字符或p当前字符为,两字符串可能匹配,且匹配结果为dp i-1 j-1若当前字符为*,有两种情况
2021-06-17 21:01:57
85
原创 LeetCode 剑指 Offer 17. 打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。通过字符串拼接,得到循环次数class Solution { public int[] printNumbers(int n) { StringBuilder sb = new StringBuilder(); while(n-- > 0){ sb.append("9"); }
2021-06-17 20:06:04
60
原创 LeetCode 剑指 Offer 16. 数值的整数次方
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。快速幂注意考虑n<0的情况class Solution { public double myPow(double x, int n) { double res = 1; if(n == 0){ return res; } if(n > 0){ while(n &g
2021-06-16 21:35:34
108
原创 LeetCode 剑指 Offer 22. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。通过双指针求出链表的长度根据长度和k求出头结点要移动的距离再从头结点出发找到相应节点class Solution { public ListNode getKthFromEnd(ListNode head, int k) { if
2021-06-16 21:17:52
62
原创 LeetCode 剑指 Offer 29. 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。按层打印从最外层逐层向内层打印通过左上角的点和右上角的点来划分每一层从外层到下一层只需左上角点的横纵坐标+1 右下角点的横纵坐标-1class Solution { ArrayList<Integer> res; public int[] spiralOrder(int[][] matrix) { if(matrix == null || matrix.length == 0){
2021-06-16 20:50:07
85
原创 LeetCode 剑指 Offer 15. 二进制中1的个数
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。(~n + 1) & n即可得到n的最后一位1用这个1异或n 即可得到去掉最后一个1的n重复上述过程直到n去掉了所有的1public class Solution { // you need to treat n as an unsigned value public int hammingWeigh
2021-06-15 12:20:49
98
空空如也
将一个类的对象数组进行排序,可以交换数组两个对象的地址么?
2021-04-01
TA创建的收藏夹 TA关注的收藏夹
TA关注的人