- 博客(113)
- 资源 (2)
- 问答 (1)
- 收藏
- 关注
原创 Linux常用命令
Linux常用命令:1、ls命令:ls -a :列出目录所有的文件(包括以.结尾的隐藏文件)ls -l :除了文件名之外,还可以将文件的权限、所有者,文件大小等信息列出来2、cd命令:cd / :进入主要目录cd ~ :进入home目录cd …:返回上一级目录3、pwd命令:pwd : 查看当前路径4、mkdir命令: 创建文件或者文件夹mkdir dir:在当前目录下创建dir文件夹或者文件5、rmdir命令: 删除文件或者删除文件夹(文件夹里面有文件无法删除)rmdir di
2021-10-13 18:29:59 1010 1
原创 计算机网络
计算机网络:1、在浏览器中输入一个网址到显示出界面,中间经历了什么?1、域名解析:首先会去本机/ect/hosts文件夹去找是否有对应的域名映射,如果有,就会返回映射的地址,就比如咱们在输入localhost的时候,显示的界面就是由本机映射127.0.0.1的。如果没有在本机上找到,浏览器就会发送一个DNS请求到本地DNS服务器找对应的IP地址,一般由网络接入服务商提供,如果在本地DNS服务器上没有找到,不能回答该请求,则此域名服务器就暂成了另一个客户,向根域名服务器发送请求解析。2、TCP三
2021-10-10 17:16:46 271
原创 初识上下文切换
上下文切换:什么是上下文切换:在单个处理器时期,操作系统就能够多线程并发执行任务。处理器给每个线程分配CPU时间片,线程在分配的时间片内执行任务CPU时间片是CPU分配给每个线程执行的时间片段,一般几十毫秒,在这么短的时间里线程互相切换,我们根本感受不到,于是就像同时在运行一样。时间片决定了一个线程可以连续占用处理器运行的时长,当一个线程的时间片用完了,或者因为自身原因被迫暂停运行了,这时候另外一个线程(可以是同一个线程或者其他线程)就会被操作系统选中,来占用处理器。这种一个线程被暂停剥夺线程使用权
2021-10-06 16:10:19 224
原创 String字符串
String 字符串关于字符串的几个知识点:1、使用 + 拼接字符串时,底层实际上是使用了StringBuilder,调用append方法将字符串拼接,最后调用toString方法返回新的字符串。2、String使用 + 和使用StringBuilder的append方法性能比较,如果不是在循环体中,性能相差无几,但是如果在循环中使用 += 拼接字符串,那么每次循环都会新建一个StringBuilder对象,就会较大的性能损耗,所以如果在循环中要进行字符串拼接,最好在外面先定义一个StringBuil
2021-09-07 10:24:12 134
原创 面试。。。。
1、什么时候会发生GC2、GC算法有哪些3、写一个单例模式4、volatile关键字是干嘛的5、TCP三次握手四次挥手简化路径:将给出的绝对路径转换为相对路径。路径中只能包含/和路径名和文件名public String subPath(String path) { String[] s = path.split("/"); Stack<String> stack = new Stack<>(); for(int i = 0; i < s.length();
2021-08-31 15:52:48 120
原创 关于Protobuf
Protocol Buffer:1、介绍:protocol buffer(简称protobuf),是谷歌出品的序列化框架,与开发语言无关,与平台无关,具有良好的可扩展性。可用于数据存储、通信协议等。protobuf生成的语言包括很多中:Java、C++、Go、C#等等,通过命令可以使proto文件生成对应的文件。protobuf的优缺点:性能好、效率高代码生成机制支持向前兼容和向后兼容支持多种编程语言缺点:应用不够广泛二进制文件可读性差缺乏自描述2、序列化和反序列化
2021-08-07 13:02:36 999
原创 Linux命令
Linux命令学习:文件内容查看命令:cat : 由第一行开始显示文件内容tac : 从最后一行开始显示。nl : 显示的时候,顺道输出行号 (常用)more : 一页一页的显示文件内容 (空格代表翻页,less命令可以向前翻页, 退出q命令 ,查找字符串 / 要查询的字符 )head : 只看头几行 head -n 文件名 查看文件的前n行tail : 参数 -n 只看尾巴几行shutdown:关机ls:查看参数:-a : 查看全部文件,包括隐藏文件-l :列出所有的
2021-08-02 09:43:07 244
原创 面经--陌陌一面
陌陌一面:面试官很和蔼,有些不会的会给你提醒,然后会跟你说清楚,面试体验很不错1、自我介绍2、叫我介绍我弄的项目,我随便介绍了其中一个3、说一些SpringMVC的一个执行过程SpringMVC执行流程:1、用户请求发送到前端控制器DispatcherServlet2、DispatcherServlet收到请求去调用处理器映射器RequestMapping3、处理器映射器去寻找具体的处理器(可以根据xml文件或者注解查找),生成处理器以及处理器拦截器。并返回给DispatcherServl
2021-07-14 22:57:57 770
原创 滑动窗口算法
滑动窗口算法:滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。往往类似于“ 请找到满足 xx 的最 x 的区间(子串、子数组)的 xx ”这类问题都可以使用该方法进行解决。滑动窗口法的大体框架在介绍滑动窗口的框架时候,大家先从字面理解下:滑动:说明这个窗
2021-07-10 11:54:18 414
原创 盛最多水的容器
11题: 盛最多水的容器给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。思路:仔细阅读题目
2021-07-08 14:56:34 109
原创 LeetCode15题---三数之和
三数之和—双指针解法给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。仔细阅读题目,要去寻找一个数组中的三个数和为0的三元组,并且答案中不能重复。以前做过进阶版的两数之和,采用的是双指针方法,但是前提是数组有序,在比较和与目标值之间,同时移动指针来达到减低复杂度的方法。对于这个题,我们先对数组进行排序,并且三个数的和为0,那么必定有负数存在,因为三个
2021-07-07 15:19:58 116
原创 LeetCodeHOT100题----34题 在排序数组中元素的第一个位置和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]思路:如果是用暴力法,依次遍历数组,用两个变量记录遍历到该元素的第一个位置下标和最后一个位置下标,然后输出。但这个方法的时间复杂度为 O(n)O(n),没有利用到
2021-07-05 10:43:46 165
原创 LeetCode23---合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6思路:1、暴力法:遍历链表数组中的所有链表 的节点,把节点的值存储
2021-07-04 10:31:56 116
原创 两数相加(链表)
两数相加:(链表版)给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.要注意两个点:1、链表输出顺序和原来链表的顺序一样。并且新链表的值就是两个链表节点的和,但是要mod 10。如果和超过10了,是有
2021-07-01 13:12:54 227
原创 LeetCode 热题 HOT 100
两数之和(数组版)给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。这是LeetCode的第一题,先仔细看题目
2021-07-01 11:58:36 153
原创 回溯算法---全排列
回溯算法:回溯法 采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:1、找到一个可能存在的正确的答案;2、在尝试了所有可能的分步方法后宣告该问题没有答案。个人理解来说,回溯算法就是穷举所有的可能性。再选择出所有满足条件的答案。就像高中做的全排列:LeetC
2021-06-22 11:12:30 746
原创 超级水王问题
超级水王数:描述:在一个数组中,如果存在一个数,在该数组中出现的次数大于数组长度的一半,那么这个数就是超级水王数暴力解决:使用HashMap来存储每个元素出现的次数,最后判断出现次数大于数组长度一半的元素并返回。代码如下: public static void Hash(int[] arr){ if(arr == null || arr.length == 0){ System.out.println("数组为空,没有水王数"); }
2021-06-19 12:32:49 319
原创 面经总结1
1、JDK与JRE的区别JDK(java程序开发包): 包括JRE + 工具包JDK(Java SE Development Kit)Java标准开发工具包。它提供Java程序所需的各种资源和工具,包括Java编译器、Java运行环境。以及常用的Java类库等。JRE:包括JVM和lib类库JRE(Java Runtime Environment)Java程序运行环境,用于解释和执行Java的字节码文件。普通用户而只需要安装 JRE来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序。
2021-06-10 15:49:26 113
原创 设计模式之建造者模式
设计模式之建造者模式1、什么是建造者模式(Builder)建造者模式: 指将一个复杂的对象的的构造与它的表示分离,使得同样的建造过程可以创建不同的形式建造者模式图解:2、建造者一般有以下几种角色:1、抽象建造者(Builder):抽象要建造的东西的结构,规范产品对象各个部分的组成。这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的对象部件的创建。2、产品类(Product):要创建的复杂对象。3、产品建造者(Worker):实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各
2021-06-01 22:43:52 177 1
原创 排序算法之基数排序
排序算法之基数排序基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。代码实现: //基数排序 public static void radixSort(int
2021-05-31 13:36:55 74
原创 LeetCode92题---反转链表2
给你单链表的头指针 head 和两个整数 left 和 right , 其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。// 示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]思路:首先定义一个哨兵节点作为参数链表的头结点,这样在返回的时候就可以直接返回头结点的next首先把链表分为两部分,一部分是要反转的部分,另一部分就是剩下的。首先找到左节点的前一
2021-05-31 13:30:04 234
原创 LeetCode124题---二叉树的最大路径和
LeetCode124题—二叉树的最大路径和路径 被定义为一条从树中任意节点出发, 沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。 该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回其 最大路径和 。private int sum = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { dfs(root)
2021-05-28 12:05:41 651
原创 LeetCode129题---求根节点到叶子结点数字之和
LeetCode129题—求根节点到叶子结点数字之和给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。计算从根节点到叶节点生成的 所有数字之和 。 叶节点 是指没有子节点的节点。输入:root = [1,2,3]输出:25解释:从根到叶子节点路径 1->2 代表数字 12从根到叶子节点路径 1->3 代表数字 13
2021-05-27 12:16:54 380
原创 LeetCode116题---填充每个节点的右侧节点指针
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。思路:因为是完全二叉树,每一层最右边的节点的next指针肯定指向的是next,左边节点的next指针指向根节点的右节点。还有一个需要考虑的问题就是左子树的右子节点如何找到右子树的左子节点,因为next指针指向的是右子节点,所以就完美解决了代码实现
2021-05-26 18:00:35 140
原创 LeetCode114题---二叉树展开为链表
//给你二叉树的根结点 root ,请你将它展开为一个单链表:// 展开后的单链表应该同样使用 TreeNode ,// 其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。// 展开后的单链表应该与二叉树 先序遍历 顺序相同。因为要和先序遍历相同,并且左子树为空,只有右节点有值,那肯定是按照先序遍历原二叉树,然后用一个辅助指针指向上一个遍历的节点,把上一个节点的值的左子节点为空,右子节点为当前的root节点。 public void flatten(TreeNode ro
2021-05-25 19:28:53 154
原创 希尔排序
排序算法之希尔排序希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。public static void main(String[] args) { int []arr = new int[]{5,2,7,3,7,2,6,0,1,6,9,4}; shellSort(arr); System.out.println(Arrays.toStr
2021-05-21 21:04:48 73
原创 LeetCode112题---路径之和1
LeetCode112题—路径之和1给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。递归思路:从上往下走,因为是判断是否是叶子节点,就是从根节点一直走到叶子节点是否刚好是指定的路径,每经过一个节点,targetNum就减去节点的值,最后在叶子节点判断一下targetNum与叶子节点 的值是否相等,如果相等就返回true,递归左子树和右子树代码实现: if(root == nul
2021-05-21 20:30:05 161
原创 LeetCode106题---根据中序遍历和后序遍历构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。思路:中序遍历步骤:左子树、根节点、右子树后序遍历步骤:左子树、右子树、根节点后序遍历数组的最后一个元素一定是根节点在找到根节点在中序遍历中的下标,找出左右子树的节点个数,依次遍历代码实现: public TreeNode buildTree(int[] inorder, int[] postorder) { //空数组直接返回 if(inorder.length == 0 ||
2021-05-20 14:41:53 131
原创 LeetCode105题---根据前序遍历和中序遍历构造二叉树
LeetCode105题:根据前序遍历和中序遍历构造二叉树思路:前序遍历的步骤:先遍历根节点再遍历左子树再遍历右子树中序遍历的步骤:先遍历左子树再遍历根节点再遍历右子树由此得知,前序遍历的第一个元素就是根节点,根据根节点在中序遍历数组中 位置,就可以找出左子树的节点个数和右子树的节点个数,然后不断递归代码实现:public TreeNode buildTree(int[] preorder, int[] inorder) { //如果数组为空,那么就是一颗空树
2021-05-20 14:35:14 174
原创 LeetCode101题--对称二叉树
LeetCode101题:给定一个二叉树,检查它是否是镜像对称的。思路:判断树是否对称的,那么就要判断左子树的左子节点是否和右子树的右子节点,左子树的右子节点和右子树的左子节点是否相同。递归实现:public boolean isSymmetric(TreeNode root) { if(root == null){ return true; } return IsSy(root.left,root.right); }
2021-05-20 14:24:00 108
原创 LeetCode100题---判断相同的树
LeetCode100题—判断两棵树是否相同给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。比较每个位置上的节点是否相同就行了递归实现: public boolean isSameTree(TreeNode p, TreeNode q) { if( p == null || q == null){ return false; } if(
2021-05-20 14:20:32 135
原创 LeetCode104、111题---二叉树的最大/最小深度
LeetCode 找二叉树的最大深度和最小深度找二叉树最大深度:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。使用递归实现找出左子树和右子树比较大的一方,然后再加1代码实现:public int maxDepth(TreeNode root) { return root == null ? 0 : Math.max(maxDepth(root.left),maxDepth(root.right))
2021-05-20 14:17:38 137
原创 LeetCode104题---二叉树最大深度
LeetCode104题:二叉树的最大深度给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。思路:求最大深度,比较左子树与右子树的深度,取大的一侧,然后再加上根节点的长度使用递归class Solution { public int maxDepth(TreeNode root) { return root == null ? 0 : Math.max(maxDepth(root.left),m
2021-05-18 21:14:17 287
原创 二叉排序树
二叉排序树二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。比节点的小的子节点是左节点,比节点大的子节点是右节点。定义一:一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;(4)没有键值相等的结点。定义二编辑
2021-05-17 15:29:37 345
原创 二叉平衡树
平衡二叉树平衡二叉树又称为AVL树平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。一棵AVL树有如下必要条件:条件一:它必须是二叉查找树。条件二:每个节点的左子树和右子树的高度差至多为1。构建平衡二叉树 单旋转与双旋转当插入节点是左左(LL)型时右右型左右型右左型代码实现:节点类:public class TreeNode { int va
2021-05-17 15:11:51 338
原创 LeetCode102题---二叉树的层序遍历
LeetCode102题—二叉树的层序遍历给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。迭代实现:广度优先遍历是按层层推进的方式,遍历每一层的节点。题目要求的是返回每一层的节点值,所以这题用广度优先来做非常合适。广度优先需要用队列作为辅助结构,我们先将根节点放到队列中,然后不断遍历队列。拿出根节点,如果左子树/右子树不为空,就将他们放入队列中。第二次处理,会将 2 和 5 这两个节点从队列中拿走,然后再将 2 和 5 的子节点放入队列中,现在队列中就
2021-05-16 22:02:12 228
原创 二叉树遍历
二叉树的先序、中序、后序遍历 递归、迭代实现递归:先序public void PreOrder(TreeNode root){ if(root == null) return; System.out.println(root.val); if(root.left != null ){ PreOrder(root.left); } if(root.right != null){ PreOrder(root.right); }}中序:public void InOrder(Tr
2021-05-16 20:44:11 65
原创 直接插入排序
八大排序之插入排序数据结构排序算法可视化网址:https://visualgo.net/zh/sorting直接插入排序基本思想:每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。插入排序默认前面的序列已经是排好的,从第一个开始,当前的元素依次和前面的数比较,直到找到自己的位置插入去,而比这个元素大的就会往后移代码实现:public class InsertSort { public static void main(String[] args) {
2021-05-15 21:30:53 141
原创 快速排序
八大排序之快速排序快速排序的思想:快速排序是属于交换类型排序,采用不断的移动和比较来进行排序,快速排序是一种非常高效的排序算法,它的实现,增大了记录和比较和移动的距离,从而减少总的比较此时和移动次数。采用分而治之的思想,将一个大的问题拆成一个小的问题,小的问题拆成更小的问题。快速排序动画网址:https://visualgo.net/zh/sorting快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部
2021-05-15 21:24:47 84
原创 LeetCode404题---左叶子之和
LeetCode404题—左叶子之和计算给定二叉树的所有左叶子之和。3/ 9 20/ 15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24思路:因为是要求的是左叶子之和,我们所需要的条件无非就是:(1)叶子节点(2)左边的节点怎么判断是否为叶子节点呢那就是当前节点的左子节点和右子节点都没有怎么是左边的节点呢?那当前的节点一定是上一个节点的左子节点找到满足条件,使用递归递归代码如下: //如果是空树,直接返回0 if(root == nu
2021-05-15 15:26:41 81
啊
2021-07-04
TA创建的收藏夹 TA关注的收藏夹
TA关注的人