自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 网络原理之TCP/IP协议

什么是协议:两个主机之间的一系列约定就称之为协议。协议中约定的细节,就表示传输的数据。因为网络通信要规定的细节还是非常多的。要是把这些细节都放在一个协议里面,那么这个协议就会非常的复杂, 于是就把不同的细节由不同的协议规定 ,所以就有了很多协议,又根据协议的功能类型,把这些协议分成了“协议簇/协议栈”OSI七层模型(既复杂又不实用) 通常使用TCP/IP五层(四层没有物理层)模型TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.这5层的层级结构

2021-09-10 21:43:56 257

原创 Linux基本指令

Linux中的命令有一个特点,如果成功了不会有提示,useradd[用户名] 创建一个新用户

2021-09-03 00:21:19 127

原创 各个排序的思想及代码

一,线程不安全的原因(1)线程是一个抢占式的执行模式(2)多个线程对同一个资源进行修改(3)修改操作不是原子性的(4)内存可见性(5)指令重排序

2021-09-02 16:14:40 152

原创 多线程编程案例

1.单例模式(1)饿汉 类加载的时候,就创建实例(线程安全)//饿汉模式class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; }}(2)懒汉 第一次调用getInstance方法创建实例(线程不安全...

2021-09-01 15:42:30 241

原创 线程安全问题

一,线程不安全的原因(1)线程是一个抢占式的执行模式(谁先谁后执行取决于系统的调度器的调度)(2)多个线程对同一个资源进行修改(这取决于需求)(3)修改操作不是原子性的(如果将修改操作打包成一个整体,禁止相互穿插进行,就可以保证线程安全 )(4)内存可见性(编译器为了效率会优化省略很多重复的步骤 但是再多线程中就会出现问题)(5)指令重排序(编译器再保证逻辑不变的前提下,为了让程序跑的更快,会对指令进行优化,重新排序,如果是再多线程中,这时就可能会出现很大的问题)使修改操..

2021-08-31 11:57:29 107

原创 线程的相关操作

1.创建线程(1)通过继承Thread类,重写run方法。(2)通过Runnable接口,把Runnable接口的值赋给Thread(Runnable本质上还是要搭配Thread来使用,只不过是换了一种指定任务的方式,Runnable只是定义一个要执行的任务,也可以搭配其他类来使用,使用Runnable可以更好的解耦合)(3)通过匿名Thread类来创建线程(本质上同(1))(4)通过匿名Runnable类来创建线程(本质上同(2))(5)通过lambda表达式来创建线程线程命名

2021-08-30 12:00:19 76

原创 进程与线程

一.进程1.进程是什么进程就是一个正在运行的程序(任务) ——任务管理器里就能看到很多进程,对操作系统来说一个任务(为了完成某个目的所要所得一系列事情)就是一个进程。2.操作系统如何管理进程(1)描述:task struct(进程描述符 Linux内核的一种数据结构 )(2)组织:用双向链表把很多task struct变量给串起来。(例如 ,看到任务管理器,就可以认为是操作系统内核遍历了这个双向链表,然后把每个节点的信息获取出来并展示。)3.一个进程的task struct里大概有什

2021-08-25 23:41:19 72

原创 Web开发相关知识点

一.servlet的理解(1)作用:Servlet是官方提供的一种web开发的规范,用Java代码来处理请求和返回响应。(2)servlet容器:由不同web服务器厂商提供具体的servlet规范的实现,这些web服务器(如Tomcat,Undertow)也就称之为servlet容器。(3)servlet和tomcat/undertow服务器之间的关系:tomcat/undertow服务器厂商会提供具体的servlet规范的实现,他们是一个servlet容器,他们(servlet容器)来统一

2021-08-24 23:47:44 138

原创 简单介绍Junit使用

如果是Maven项目就先导入依赖<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> </dependency> <..

2021-08-23 22:43:27 566

原创 测试知识总结

一.认识软件测试1.了解软件测试软件测试:测试软件功能是否符合需求软件测设和软件调试的区别:(1)测试是检查软件是否符合用户的需求 调试是检查自己写的代码时候实现了自己想要的功能(2)角色不同:测试是 黑盒测试工程师,白盒测试工程师,开发人员(单元测试);调试是开发人员。(3)阶段不同:调试是存在于开发阶段;软件测试存在于整个软件开发的生命周期里(软件开发的生命周期:需求—计划—设计—编码—测试—运行维护)。2.需求什么是需求:为了满足用户的期望和规定的合同(文档,标准,规范

2021-08-19 19:58:34 399

原创 网络原理之http

1.首先http协议是一个应用层协议,且是使用最广泛的协议之一,它关注的是应用细节,就像是一个产品使用手册一样,应用层可以由程序员自己规定实现,Http协议是别人设计好的可以直接拿来用的应用层协议。2.HTTP协议格式(一个http请求)其中Request(请求)中的请求行 里面的(1)Method就:是这次请求操作的方法类型如GET,POST。上图就是一个POST请求通常GET没有请求正文 是在URL中利用查询字符串来实现的 ,而POST则有请求正文。(2)URL(网址..

2021-08-19 16:37:55 87

原创 哈希表总结

哈希表的核心问题就是如何解决冲突/碰撞(不同的关键码通过hash函数得到了一个相同的下标)问题方法有两种 (1)是避免冲突 (2)是解决冲突(1)避免冲突的方法(哈希冲突无法避免这只是尽可能的降低产生冲突的可能性):1.设计哈希函数 例:数据集合{1,8,6,7,4,3} ,设计hash函数为 hash(key) == key % capacity(储存元素底层空间的总大小) 常见的设计方法 :1.直接定制法--(常用)取关键字的某个线性函数为散列地址:Hash(Key)=A*...

2021-08-18 23:13:37 296

原创 迷宫问题(dfs+回溯)

定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5×5数组下所示:intmaze[5][5]={0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一格是可以走的路。本题含有多组数据。...

2021-08-16 19:30:33 333

原创 图像的渲染

有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。给你一个坐标(sr, sc)表示图像渲染开始的像素值(行 ,列)和一个新的颜色值newColor,让你重新上色这幅图像。为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。最后返回经过上色渲染...

2021-08-16 00:23:00 146

原创 员工的重要性

给定一个保存员工信息的数据结构,它包含了员工 唯一的 id ,重要度和 直系下属的 id 。比如,员工 1 是员工 2 的领导,员工 2 是员工 3 的领导。他们相应的重要度为 15 , 10 , 5 。那么员工 1 的数据结构是 [1, 15, [2]] ,员工 2的 数据结构是 [2, 10, [3]] ,员工 3 的数据结构是 [3, 5, []] 。注意虽然员工 3 也是员工 1 的一个下属,但是由于 并不是直系 下属,因此没有体现在员工 1 的数据结构中。现在输入一个公司的所有员工信息,.

2021-08-15 23:28:05 102

原创 宝石与石头

给定字符串J代表石头中宝石的类型,和字符串S代表你拥有的石头。S中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J中的字母不重复,J和S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。先把宝石全放进set中 然后遍历石头的每一个字符 如果set包含这个字符他就是宝石 count++class Solution { public int numJewelsInStones(String jewels, St...

2021-08-14 23:28:29 117

原创 计算字符串的距离

import java.util.*;public class Main{ public static void main(String[] args){ Scanner s = new Scanner(System.in); while(s.hasNext()){ String A = s.nextLine(); String B = s.nextLine(); int n...

2021-08-12 21:26:35 78

原创 根据二叉树创建字符串

class Solution { public static String creat(TreeNode root ,StringBuilder str ) { if (root == null)return null; //先要拼接根节点 else { str.append(root.val); } //拼接根节点的左子树 if (root.left != ...

2021-08-03 23:32:36 48

原创 二叉搜索树转换成排序双向链表

public class Solution { //一个前驱节点 用于修改 pRootOfTRee 的left 和 right 的指向 TreeNode pre = null; //转换排序 public TreeNode Sort(TreeNode pRootOfTRee){ if(pRootOfTRee == null) return pRootOfTRee; //先找到二叉树最左边的节点 Convert(pRootO...

2021-08-03 23:07:49 76

原创 二叉树的最近公共祖先

class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null) return root; //判断根节点是否为公共祖先 if(root == p || root == q) return root; TreeNode left = lowestComm...

2021-08-03 22:42:39 40

原创 二叉树的层序遍历

class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> lists = new LinkedList<>(); if(root == null) return lists; Queue<TreeNode> queue = new LinkedList...

2021-08-03 19:56:32 36

原创 二叉树遍历

import java.util.*;class TreeNode { public char val; public TreeNode left; public TreeNode right; public TreeNode(char val) { this.val = val; }}public class Main { //由于下面递归的时候i不能每次从0开始 所以把i写在外面 public static ...

2021-08-03 19:30:09 46

原创 单词倒排。

import java.util.*;public class Main{ public static void main(String[] args){ Scanner s = new Scanner(System.in); while(s.hasNext()){ String a = s.nextLine(); char[] b = a.toCharArray(); ...

2021-08-03 19:13:05 33

原创 骆驼命名法

import java.util.*;public class Main{ public static void main(String[] args){ Scanner s = new Scanner(System.in); while(s.hasNext()){ String a = s.nextLine(); String[] b = a.split("_"); String...

2021-08-03 19:09:57 54

原创 对称二叉树

public boolean isSymmetric(TreeNode root) { if(root == null) return true; //把一颗树的左右子树 看成独立的两棵树 去比较他俩是否对称 return Symmetric(root.left,root.right); }//判断是否对称 public boolean Symmetric(TreeNode left, TreeNode right){ if...

2021-08-03 00:27:56 40

原创 检验一颗树是否为平衡二叉树

//求二叉树的最大深度 public int maxDepth(TreeNode root) { if(root == null) return 0; int left = 0; int right = 0; left = maxDepth(root.left) + 1; right = maxDepth(root.right) + 1; return left > right ? left : right; ..

2021-08-03 00:09:32 52

原创 二叉树的最大深度

public int maxDepth(TreeNode root) { if(root == null) return 0;//分别算出左子树的高度 和 右子树的高度 int left = 0; int right = 0; left = maxDepth(root.left) + 1; right = maxDepth(root.right) + 1;//最后返回 两者之间更大的 就是二叉树的深度 return left ...

2021-08-03 00:00:29 60

原创 归并排序.

归并排序是稳定的排序算法时间复杂度为O(nlogn) //排序组合 public static void merge(int[] array,int low,int mid,int high) { //new 一个长度是两个小块长度和 的数组 这里用high-low是因为 右边的分组的low不是从0开始的 low+high的话长度就会错误 int[] merge = new int[high-low+1]; //新数组的下标

2021-08-02 23:52:22 46

原创 堆排........

堆排是不稳定的排序算法时间复杂度为 O(nlogn) public static void adjust(int[] array,int p ,int len){ //记录左左子节点的位置 int child = 2 * p + 1; //当子节点没有大于数组长度时循环 while (child<len){ //如果 有右子节点 并且 右子节点大于左子节点 就child++用 右子节点和父节点比较大小

2021-08-02 23:49:08 30

原创 快速排序。。。。

快速排序是一个不稳定的排序算法时间复杂度为O(nlongn) //找到基准 把比它小的放它前面 比它大的放它后面 public static int surek(int[] array,int low , int heigh ){ //设定基准值 int pivot = low; //基准的后一位 int index = low+1; //从基准的后一位开始直到最后一个数据 这里的i<=有=是因为前面传

2021-08-02 23:44:43 58

原创 检验是否是另一棵树的子树

public boolean isSubtree(TreeNode root, TreeNode subRoot) { if(root == null && subRoot == null) return true; if(root == null || subRoot == null) return false; if(isSameTree(root , subRoot)) { r..

2021-08-02 19:57:18 29

原创 检验两个二叉树是否相同

public boolean isSameTree(TreeNode p, TreeNode q) { //同时为空说明p.val 一直等于 q.val if(p == null && q == null) return true; //不同时为空说明不等 if(p == null || q == null) return false; if(p.val == q.val){ ..

2021-08-02 19:37:06 40

原创 二叉树后续遍历(递归与非递归)

后序遍历(递归 public void postorder(TreeNode root,List<Integer> list){ if(root == null) return; postorder(root.left,list); postorder(root.right,list); list.add(root.val); } public List<Integ

2021-08-02 19:24:38 64

原创 二叉树中序遍历(递归与非递归)

中序遍历(递归) public void inorder(TreeNode root,List<Integer> list){ if(root == null) return; inorder(root.left,list); list.add(root.val); inorder(root.right,list); } public List<Integer>

2021-08-02 19:22:02 39

原创 二叉树的前序遍历(递归 与 非递归)

前序遍历(递归) public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new LinkedList(); preorder(root,list); return list; } public void preorder (TreeNode root , List<Integer> list){ .

2021-08-02 19:17:08 42

原创 插入排序 。。。。

按照代码,最坏的情况(每次插入都遍历一遍已经排好序的数组):外层循环n-1次,内层循环1+2+3+…+(n-2)=(n-2)(n-1)/2次所以最坏情况是O(n^2)按照代码,最好的情况(已经有序):O(n)平均情况为:(n^2 + n)/2,因为二次函数比一元一次函数增长快,所以为插入排序算法的时间复杂度为O(n^2)稳定的排序算法public class InsertSort { public static void insertSort(int[] array) {

2021-07-30 00:13:49 35

原创 选择排序 ...

选择排序是不稳定的算法举个例子,序列68 629,我们知道第一遍选择第1个元素6会和2交换,那么原序列中2个6的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。O(n^2)时间复杂度 public static void selectSort(int[] array) { //有多少数据 就需要选择 多少-1 次 for (int i = 0; i <array.length-1 ; i++) { /...

2021-07-29 23:37:29 42

原创 冒泡排序.....

public static void bubbleSort(int[] array){ //有多少数据就得排序 -1次 因为最后一次就不用再排序了已经有序了 for (int i = 0; i <array.length-1 ; i++) { //用来判定数据是否已经有序 没有就继续排序 已经有序了就不需要后续排序了直接跳出循环 boolean flag = true; //每...

2021-07-29 23:14:32 96

原创 各集合类的方法总结

用 put get 来存取元素的集合类有 map用 add get 来存取元素的集合类有 List LinkedList ArrayList用 push pop 来存取元素的集合类有 Stack用 add poll 来存取元素的集合类有 Queue容积用 size()表示的集合类有ListLinkedList ArrayList长度用length() 的有 String长度用length 的有 int[] String[]等数组 这是它们自身的属性...

2021-07-24 23:16:48 35

原创 反转链表。

给你单链表的头节点head,请你反转链表,并返回反转后的链表。class Solution { public ListNode reverseList(ListNode head) { if(head == null) return null ; ListNode a = head; ListNode b = a.next; a.next = null; while(b!=null){ ListN..

2021-07-07 21:26:27 32

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除