- 博客(279)
- 收藏
- 关注
原创 io.netty包下ByteBuf基本使用
代码:import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import java.util.Arrays;public class ByteBufTest { public static void main(String[] args) { // 0.创建一个非池化的ByteBuf,大小为10个字节 ByteBuf buf = Unpooled.buffer(10);
2021-09-28 16:08:17
1515
原创 字符串中最长不重复子串长度-快手面试
给定字符串,返回最长不重复子串的长度比如:输入"abcaf",返回4,代表子串"bcaf"输入"abccf",返回3,代表子串"abc"思路:通过set记录遍历过的元素import java.util.*;public class Main { public static void main(String[] args) { String s = "abccf"; System.out.println(maxLength(s)); }
2021-09-14 13:31:11
398
原创 斜着打印二维数组-字节面试
给定二维数组,斜着打印出来1,2,3,45,6,7,89,10,11,12------ 斜着打印二维数组1,5,2,9,6,3,10,7,4,11,8,12思路第一种方法,利用广度优先遍历的思想,时间复杂度O(n),空间复杂度O(n),n为二维数组的行数第二种方法,根据规律,斜着遍历的行,坐标和固定,时间复杂度O(n),空间复杂度O(1)代码package com.qunar.flight.userproduct.athena.supercell.core.web.cont
2021-09-13 17:08:43
828
原创 [LeetCode]784. 字母大小写全排列
原题链接https://leetcode-cn.com/problems/letter-case-permutation/submissions/思路:类似于字符串全排列,只是不需要变换位置,改成了转换大小写代码class Solution { public List<String> letterCasePermutation(String s) { List<String> result = new ArrayList<>();
2021-09-08 22:45:12
143
原创 [LeetCode]404. 左叶子之和
原题链接:https://leetcode-cn.com/problems/sum-of-left-leaves/思路:递归,dfs左叶子节点:是父亲节点的左孩子,左节点和右节点都是null代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} *
2021-09-08 13:49:08
98
原创 链表-从尾到头打印链表-JZ3
描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。如输入{1,2,3}的链表如下图:返回一个数组为[3,2,1]0 <= 链表长度 <= 10000代码2:非递归/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;*
2021-09-08 01:56:47
122
原创 栈-栈的压入、弹出序列-JZ21
描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)示例1输入: [1,2,3,4,5],[4,3,5,1,2]返回值: false思路直接用辅助栈,模拟栈入栈出栈初始化:用指针i指向pushA的第一个位置, 指针j指向popV的第一个位
2021-09-08 01:29:40
104
原创 栈-包含min函数的栈-JZ20
描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数,并且调用 min函数、push函数 及 pop函数 的时间复杂度都是 O(1)push(value):将value压入栈中pop():弹出栈顶元素top():获取栈顶元素min():获取栈中最小元素思路:使用辅助栈,专门存放最小值代码import java.util.Stack;public class Solution { Stack<Integer> stack = new St
2021-09-08 01:08:34
111
原创 栈-用两个栈实现队列-JZ5
描述用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。思路push操作就直接往stack1中push,pop操作需要分类一下:如果stack2为空,那么需要将stack1中的数据转移到stack2中,然后在对stack2进行pop,如果stack2不为空,直接pop就ok。代码import java.util.Stack;public class Solution {
2021-09-08 01:00:55
114
原创 树-二叉搜索树的第k个结点-JZ62
描述给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。示例1输入: {5,3,7,2,4,6,8},3返回值: 4说明: 按结点数值大小顺序第三小结点的值为4思路根据二叉搜索树的性质,其中序遍历是由大到小的,由此仅需要中序遍历找到第k个小的结点即可。中序遍历具体做法:用栈记录当前结点,不断往左深入,直到左边子树为空,再弹出栈顶(即为当前子树的父结点),然后再访问其右子树,其中每棵子树都遵循左中右的次序。时间复杂度:O(n),每个结点遍历一遍空间复杂度:O(n),栈空间最
2021-09-07 23:43:00
125
原创 树-序列化二叉树-JZ61
描述请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串
2021-09-07 23:22:45
113
原创 树-按之字形顺序打印二叉树-JZ59
描述给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树之字形层序遍历的结果是[[1],[3,2],[4,5]]思路:之字形输出,bfs层次遍历,可以用队列也可以用栈,如果用队列,需要设定变量,基数层从左往右输出,偶数层从右往左输出(塞入result的时候翻转)如果用栈,可以使用两个栈,这样的话就不用翻转了代码:import java.util.ArrayList;impo
2021-09-07 22:41:59
186
原创 树-对称的二叉树-JZ58
描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。示例1输入: {8,6,6,5,7,7,5}返回值: true示例2输入: {8,6,9,5,7,7,5}返回值: false思路若满足对称二叉树,必须满足:L->val == R->valL->left->val == R->right->valL->right->val == R->left->v
2021-09-07 22:17:55
86
原创 树-二叉树的下一个结点-JZ57
描述给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示示例:输入:{8,6,10,5,7,9,11},8返回:9解析:这个组装传入的子树根节点,其实就是整颗树,中序遍历{5,6,7,8,9,10,11},根节点8的下一个节点就是9,应该返回{9,10,11},后台只打印子树的下一个节点,所以只会打印9,如下图
2021-09-07 22:01:48
272
2
原创 树-二叉树的深度-JZ38
描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。示例1输入: {1,2,3,4,5,#,6,#,#,7}返回值: 4代码1:dfs/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.va
2021-09-07 21:21:04
93
原创 树-二叉树中和为某一值的路径-JZ24
描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。示例1输入: {10,5,12,4,7},22返回值: [[10,5,7],[10,12]]示例2输入: {10,5,12,4,7},15返回值: []思路1.利用DFS遍历树,遍历至叶子节点看是否符合要求题目要求2.每次回退要移除列表的末尾元素,使路径回到父节点时间复杂度为O(n);空间复杂度为O(n)。代码im
2021-09-07 20:56:06
113
原创 树-二叉搜索树的后序遍历序列-JZ23
描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜索树)示例1输入: [4,8,6,12,16,14,10]返回值: true思路1.二叉搜索树:左子树全部小于根节点,右子树全部大于根节点2.后序遍历:左子树 -> 右子树 -> 根节点,做后一个节点是根节点3.我们可以将一个序列划分为3段, 左子树+右子树+根, 例如[4, 8, 6, 12, 1
2021-09-07 20:23:58
152
原创 树-从上往下打印二叉树-JZ22
描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。示例1输入: {5,4,#,3,#,2,#,1}返回值: [5,4,3,2,1]思路广度优先遍历,利用队列存储数据时间复杂度:O(N),需要遍历整个树;空间复杂度:队列中存储的子节点最多为N/2(平衡树),O(N);代码import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/**public class TreeNo
2021-09-07 20:03:27
124
原创 树-二叉树的镜像-JZ18
描述操作给定的二叉树,将其变换为源二叉树的镜像。比如: 源二叉树 源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5示例1输入: {8,6,10,5,7,9,11}返回值: {8,10,6,11,9,7,5}代码1 递归import java.uti
2021-09-06 01:50:51
127
原创 树-树的子结构-JZ17
描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1输入: {8,8,#,9,#,2,#,5},{8,9,#,2}返回值: true思路1.另起函数判断两个树是否相等,里面用到递归2.分治法,先判断A是否和B相等,判断B是否是A的相同结构3.如果不是,分别判断是否是A的左右子树的子结构时间复杂度:O(MN),其中 M,N分别为树 pRoot1和 树 pRoot2的节点数量;遍历pRoot1:O(m),比较pRoot1和pRoot2:O(n
2021-09-06 00:40:05
87
原创 链表-链表中环的入口结点-JZ55
描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。输入描述:输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台将这2个会组装成一个有环或者无环单链表返回值描述:返回链表的环的入口结点即可。而我们后台程序会打印这个节点示例1输入: {1,2},{3,4,5}返回值: 3说明: 返回环形链表入口节点,我们后台会打印该环形链表入口节点,即3示例2输入: {1},{}返回值: “null”说明: 没有环,返回null,后台打印"null"
2021-09-06 00:19:05
131
原创 链表-删除链表中重复的结点-JZ56
描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5示例1输入: {1,2,3,3,4,4,5}返回值: {1,2,5}思路在遍历单链表的时候,检查当前节点与下一点是否为相同值,如果相同,继续查找祥同值的最大长度代码:/* public class ListNode { int val; ListNo
2021-09-06 00:18:53
108
原创 链表-两个链表的第一个公共结点-JZ36
描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)示例1输入: {1,2,3},{4,5},{6,7}返回值: {6,7}说明:第一个参数{1,2,3}代表是第一个链表非公共部分,第二个参数{4,5}代表是第二个链表非公共部分,最后的{6,7}表示的是2个链表的公共部分这3个参数最后在后台会组装成为2个两个无环的单链表,且是有公共节点的示例2输入: {1},{2,3},{}返回值: {}说
2021-09-05 17:22:10
123
原创 链表-复杂链表的复制-JZ25
描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。示例:输入:{1,2,3,4,5,3,5,#,2,#}输出:{1,2,3,4,5,3,5,#,2,#}解析:我们将链表分为两
2021-09-05 16:53:40
77
原创 链表-合并两个排序的链表-JZ16
描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例1输入: {1,3,5},{2,4,6}返回值: {1,2,3,4,5,6}代码:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { publ
2021-09-05 15:57:45
74
原创 链表-反转链表-JZ15
描述输入一个链表,反转链表后,输出新链表的表头。示例1输入: {1,2,3}返回值: {3,2,1}代码:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNode head)
2021-09-05 15:35:28
76
原创 链表-链表中倒数最后k个结点-JZ14
描述输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为 0 的链表。示例1输入: {1,2,3,4,5},1返回值: {5}思路快慢指针,避免越界代码import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * th
2021-09-05 15:06:56
203
原创 数组-构建乘积数组-JZ51
描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]*A[1]*…*A[i-1]*A[i+1]*…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。示例1输入: [1,2,3,4,5]返回值: [120,60,40,30,24]思路由于l
2021-09-05 06:06:42
136
原创 数组-数组中重复的数字-JZ50
描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1示例1输入: [2,3,1,0,2,5,3]返回值: 2说明: 2或3都是对的思路本题可以依赖于外部空间,建立hash数组记录次数但是由于题意中:在一个长度为n的数组里的所有数字都在0到n-1的范围内,可
2021-09-05 05:37:03
168
原创 数组-数组中的逆序对-JZ35
描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007对于50%的数据,size≤10^4对于100%的数据,size≤10^5输入描述:题目保证输入的数组中没有的相同的数字示例1输入: [1,2,3,4,5,6,7,0]返回值: 7思路利用归并排序,排序过程中计算逆序对复杂度分析:时间复杂度:O(NlogN)。归并排序的时间
2021-09-05 04:56:49
212
原创 数组-把数组排成最小的数-JZ32
描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。示例1输入: [3,32,321]返回值: “321323”思路利用贪心思想,, 自定义排序,拼接后就是最终结果,字符串返回,防止大数超出界限时间复杂度:O(NlogN), 排序耗时空间复杂度:O(N)代码import java.util.ArrayList;import java.util.Collec
2021-09-05 04:00:08
229
原创 数组-数组中出现次数超过一半的数字-JZ28
描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000,0<=数组元素<=10000示例1输入: [1,2,3,2,2,2,5,4,2]返回值: 2示例2输入: [3,3,3,3,2,2,2]返回值: 3示例3输入: [1]返回值:
2021-09-05 03:37:14
166
原创 字符串-翻转单词序列-JZ44
描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?示例1输入: “nowcoder. a am I”返回值: “I am a nowcoder.”思路1.翻转整个字符串2.
2021-09-04 20:59:42
115
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人