自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 资源 (1)
  • 收藏
  • 关注

原创 Java项目之搜索引擎

前置知识搜索引擎的核心功能,就是查找到一组和用户输入的词/一句话 相关联的网页关键字:搜索词;搜索结果的标题,搜索结果的描述,展示URL,跳转过去的目标页面,称为“落地页”;对于一个搜索引擎来说,首先,需要获取到很多很多的网页;然后再根据用户输入的查询词,在这些网页中进行查找。1.搜索引擎的网页是怎么获取到的?此处主要是涉及到“爬虫”这样的程序(Http客户端)2.用户输入了查询词之后,如何去让查询词和当前的这些网页进行匹配?假设当前已经爬取到了一亿个网页,用户输入了一个"蛋糕"这.

2022-05-08 16:32:51 3115

原创 MyBatis使用详解

1.什么是MyBatisMyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。简单说 MyBatis 是更简单完成程序和数据库交互的工具。2.如何使用MyBatis先添加MyBatis框架的支持先

2022-04-29 14:55:06 335

原创 SpringBoot中的测试框架

1.在创建 springboot 项目的时候,会自动创建测试框架2.在需要进行测试的类里面右击之后点击Generate,选择Test3.给测试类加上 @SpringBootTest 注解声明当前的类是在 Spring Boot 容器中运行4.在方法中构建单元测试代码@SpringBootTest@Transactional() // 单元测试不污染业务数据class UserControllerTest { @Autowired private UserController

2022-04-25 16:18:14 1074

原创 最详细的一篇讲解SpringMVC的博客

1.什么是 Spring MVCMVC 是一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。Spring MVC是对MVC思想的具体实现。学习 Spring MVC 需要掌握以下三个功能:连接的功能:将用户(浏览器)和Java程序连接起来,也就是访问一个地址能够调用到我们的 Spring 程序。@RequestMapping("/hi")获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数。输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户

2022-04-24 19:35:20 398

原创 IDEA中Spring Boot项目部署热加载

什么是热加载?可以简单的把热加载理解成IDEA会自动部署项目,不需要自己写好代码之后,重新运行项目。达到更快捷开发项目的目的。让我们开始实际操作吧。1.在Spring Boot项目中引入dev-tools框架其实这一步在创建Spring Boot项目的时候,选择Spring Boot DevTools就可以了。2.Settings开启项目自动编译3. 开启运行中热部署4.点击Debug,开启热部署...

2022-04-23 15:56:03 526

原创 Solidity学习笔记

学习视频来源:基于以太坊的智能合约开发教程【Solidity】读取数据不需要消耗燃料费Gas,修改数据需要消耗燃料费。pragma solidity ^0.4.0;contract Helloworld{ string Myname = "lushuo"; function getName() public view returns(string){ return Myname; } function changeName(string n

2022-04-14 21:43:10 6269

原创 最详细的一篇讲解SpringBoot的博客

2022-04-11 20:39:39 417

原创 二叉树的核心思想应用实例:二叉树镜像/二叉树的深度/平衡二叉树

关于 Tree 的最经典的递归套路用主函数传参 root.left 和 root.right ,并用一个引用保存同时也应该关注返回值以及返回结果剑指 Offer 27. 二叉树的镜像请完成一个函数,输入一个二叉树,该函数输出它的镜像。class Solution { public TreeNode mirrorTree(TreeNode root) { // 首先进行判空操作 if(root == null){ return .

2022-04-07 19:33:50 354

原创 剑指 Offer 54. 二叉搜索树的第k大节点

给定一棵二叉搜索树,请找出其中第 k 大的节点的值。首先要知道二叉树的前中后递归遍历知道二叉搜索树的中序遍历是有序的知道链表的第K大的节点就是 size-Kclass Solution { ArrayList<Integer> list = new ArrayList<>(); public int kthLargest(TreeNode root, int k) { inorder(root,list); // 第 K

2022-04-07 16:43:56 510

原创 剑指 Offer 53 - I. 在排序数组中查找数字 I

统计一个数字在排序数组中出现的次数。题解同样是使用HashMap来解题但是发现效率并不高,后续再改进。class Solution { HashMap<Integer,Integer> hashMap = new HashMap<>(); public int search(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { if(

2022-04-07 11:46:01 417

原创 剑指 Offer 52. 两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共节点。题解核心思想是利用两个链表的 节点和 相同首先进行判空操作循环的条件是只要两个节点的引用的地址(使用==)不相同,则继续循环如果 A 链表的引用为空之后,将A链表的引用调整到B链表的头结点B链表同理最后返回任意一个节点的引用就是第一个公共节点public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

2022-04-07 11:34:44 283

原创 剑指 Offer 50. 第一个只出现一次的字符

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。题解利用 HashMap 容器来解题两次循环,注意第二次循环仍然是遍历字符串,而不是遍历容器的所有 value 值class Solution { HashMap<Character,Integer> hashMap = new HashMap<>(); public char firstUniqChar(String s) { for (int

2022-04-06 22:00:19 184

原创 剑指 Offer 42. 连续子数组的最大和

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。题解定义一个与原数组相同大小的数组 dp默认原数组的第一个数为 连续子数组的最大值 maxNumdp[i-1] 是为保存上一个连续数组的最大值二设置的,方便下一个数据的计算dp[i] 保存当前位置为 连续子数组最后一个数据的时候的最大值核心是判断 dp[i-1] 的值是不是大于0class Solution { public int maxSubArray(int

2022-04-06 21:32:09 169

原创 剑指 Offer 40. 最小的k个数

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。题解最简单的思路就是对数组进行排序,然后再循环取前四个元素class Solution { public int[] getLeastNumbers(int[] arr, int k) { int[] ret = new int[k]; Arrays.sort(arr); for(int i=0;i<k

2022-04-05 11:34:58 241

原创 剑指 Offer 39. 数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。题解:首先想到的常规解法是利用HashMap首先引入 HashMap 数据结构首先利用 hashmap.containsKey() 判断数组当前的值是否在容器中已经存在,如果不存在,直接将 value 值设为1。如果存在,则将通过 hashmap.get(nums[i])获取的 value 加1.通过 for each 遍历容器的 key 值。判断是否大于数组长度的一半class Solution { Has

2022-04-05 11:26:06 632

原创 剑指 Offer 32 - I II III. 从上到下打印二叉树

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。层次遍历题解层次遍历首先应该想到的就是借助队列来实现。在这里插入代码片

2022-04-05 09:46:55 109

原创 剑指 Offer 30. 包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。题目表述:利用栈来实现得到最小元素的栈题解利用栈来实现入栈,出栈,得到栈顶元素,得到栈的入栈元素利用一个栈来实现以上功能,核心是使用双入栈来保存最小值定义一个栈和一个最小值,最小值初始化为栈的最大值那么得到栈顶元素和返回最小值就很简单了核心是入栈和出栈入栈(双入栈):如果入栈的值比小于或等于当前最小值,那么先将原先的最小值入栈,最后再将当前

2022-04-04 17:18:45 349

原创 剑指 Offer 28. 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

2022-04-03 15:35:20 354

原创 剑指 Offer 27. 二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。题解本题比较简单,核心思想就是先进行判空检验操作。随后对左孩子和右孩子进行交换核心就是对左右子树进行递归操作最后返回根节点class Solution { public TreeNode mirrorTree(TreeNode root) { // 首先进行判空操作 if(root == null){ return null; } if(r

2022-04-01 21:21:17 535

原创 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。题解这题太让我恶心了。核心是循环交换的思想,难点是交换的条件以及跳出本次循环的条件。首先想到用两个指针来标记奇数和偶数的位置。i 下标代表搜索 奇数的下标,从 0 开始j 下标代表搜索 偶数的下标,从最后一个数据开始只要两个指针没有相遇,进入循环如果 i 下

2022-04-01 14:56:07 489

原创 剑指 Offer 18. 删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.题解为了防止前一个节点(preNode)发生空指针异常,所以这里对头结点进行单独判断对剩余节点进行循环判断class Solution { publ

2022-04-01 11:00:01 468

原创 剑指 Offer 17. 打印从1到最大的n位数

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]题解本题可以翻译成怎么使输入的整数 n 代表位数对输入的 n 从 1 开始循环,每一次循环将 num *10将局部数组变量大小初始化为 num-1最后遍历给数组赋值即可class Solution { public int[] printNumbers(int n)

2022-04-01 10:20:58 106

原创 剑指 Offer 11. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。示例 1:输入:number

2022-03-31 22:17:05 126 1

原创 剑指 Offer 06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]题解我首先想到的是反转链表,然后将反转的链表的值循环赋值给数组。后来出现了空指针异常的问题。问题是因为没有对创建的数组进行初始化大小设置。 public int[] reversePrint(ListNode head) { if(head == null){ return null; }

2022-03-30 19:50:06 1267

原创 剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”题解首先想到用替换函数 replace(" “,”%20"); 将原字符串进行替换用字符串的 replaceAll 函数也可以,但是效率没有 replace 好不使用函数,使用StringBuilder创建stringBuilder对象str将遍历的单个字符赋值给 ch接着判断该字符是不是为空格如果是空格,就在str后面

2022-03-30 16:05:52 288

原创 剑指 Offer 03. 数组中重复的数字

题目介绍找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3题解题目可以翻译成找出一个数组中第一个重复的数据选择容器,由于只是找出数组中的重复值,不涉及下标,选择Map和Set中的Set遍历数组,同时判断该数据是否能添加到(add)Set中如果不能添.

2022-03-30 14:33:56 293

原创 Java数据结构之堆

堆的概念堆逻辑上是一棵完全二叉树堆物理上是保存在数组中满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆反之,则是小堆,或者小根堆,或者最小堆堆的基本作用是快速找集合中的最值二叉树的顺序存储使用数组保存二叉树结构,方式即将二叉树用层序遍历方式放入数组中。一般只适合表示完全二叉树,因为非完全二叉树会有空间的浪费。这种方式的用法就是堆的表示。顺序存储中的双亲与孩子的下标关系已知双亲的下标:左孩子下标 = 2*parent+1;右孩子下标 = 2*parent

2022-03-29 17:23:50 4133

原创 计算机网络总结

初识网络原理概念IP地址和端口号IP地址用于定位主机的网络地址。IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。人们为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4组,每组以「 . 」隔开,再将每组转换成十进制。端口号用于定位主机中的进程端口号是0~65535范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。注意:两个不同的进程,不能绑定同一个端口号,但一个进

2022-03-27 10:07:49 3577 1

原创 数据结构之数组

leetcode1.两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2

2022-03-24 14:02:34 279

原创 最详细的一篇讲解Spring的博客

一:什么是Spring,IoC,DISpring是包含了众多工具方法的IoC容器。既然是Ioc容器就包含了两个最核心最基础的概念。最核心的功能就是:一是把对象存储到Spring当中,第二个就是把对象从Spring当中取出来。IoC(Inversion of Control 控制反转),使用控制反转的思路可以实现依赖类之间的解耦,让我们不必去关心依赖类之间的具体实现和生命过程,只需要再使用它的时候把它注入进来就可以。优点是实现类和依赖类之间的解耦。在底层依赖类发生变化的时候,无需关心它的实现。因为我们

2022-03-21 18:58:47 990

原创 多线程进阶

一:线程池1.线程池的由来本来多进程就是为了解决并发编程的方案,但是进程有点太重量了(创建和销毁,开销比较大)因此引入了线程,线程比进程要轻量很多。即便如此,如果某些场景中,需要频繁的创建销毁线程,此时,线程的创建和销毁的开销,也就无法被忽视了。线程池就是为了解决这样的问题而来。2.线程池的使用使用线程的时候,不是说用的时候才创建,而是提前创建好,放到一个“池子里”(和字符串常量池是类似的东西)当我们需要使用线程的时候,直接从池子里取一个线程过来。当我们不需要这个线程的时候,就把这个线程还回

2022-03-21 15:27:52 553

原创 Java基础之反射和枚举

一:反射1.什么是反射Java的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意方法和属性,同样也可以修改部分类型信息。这种动态获取信息以及动态调用动态方法的功能称为Java语言的反射机制。2.反射相关的类类名用途Class类代表类的实体,在运行的Java程序中表示类和接口Field类代表类的成员变量/类的属性Method类代表类的方法Constructor类代表类的构造方法2.1

2022-03-17 19:47:48 1198

原创 数据结构之 Map 和 Set

Map 和 Set 是一种适合动态查找的集合容器Map中存储的是 key-value 的键值对,Set中只存储了 KeyHashMap的使用简单案例package Map_Set;import java.util.HashMap;import java.util.Map;public class Test_HashMap { public static void main(String[] args) { Map<String,String> hashM

2022-03-17 07:47:43 988

原创 剑指 Offer 09. 用两个栈实现队列&leetcode232.用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, siz

2022-03-14 11:56:28 103

原创 剑指 Offer 22. 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。解题思路先让临时指针先移动 倒数k - 1 步。然后对临时指针所处位置进行循环判断。只有临时指针不为空,另一个指针随临时指针一起移动。代码如下class Solution { public ListNode getKthFromEnd(Lis

2022-03-14 11:05:18 900

原创 leetcode876.链表的中间结点

给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NU

2022-03-14 10:22:56 88

原创 leetcode234.回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例 1:输入:head = [1,2,2,1]输出:true示例 2:输入:head = [1,2]输出:false解题思路代码如下...

2022-03-14 10:12:05 937

原创 剑指 Offer 24. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]解题思路关键在于指针移动的顺序 与 节点之间绑定的先后顺序。先获取头结点的下一个节点的引用再更改头结点指向的下一个节点的引用再移动 preNode 指针最后移动头结点的引用指针返回 preNode 节点代码如下class Solution { public ListNode reverseList(ListNode head

2022-03-11 14:02:17 102

原创 leetcode160.相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。解题思路设置两个双指针,谁先移动到空指针的位置则将指针跳转到另一条链上两指针相遇的地方就是相交节点代码如下public class Solution { public ListNode getInters

2022-03-11 11:31:53 1037

原创 leetcode142.环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。示例 1:输入:head = [3,2,0,-4], pos = 1输出:返回索引为

2022-03-11 10:15:19 61

Android软件恶意行为检测技术研究_曲家兴.caj

Android软件恶意行为检测技术研究_曲家兴.caj

2021-07-11

空空如也

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

TA关注的人

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