自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 AC算法(自学过程详细讲解,方便大家理解)

Aho-Corasick自动机算法,简称就叫做AC算法。网上看了各种各样的AC算法,其实都看的不太理解。最后还得导师亲自给我讲解了前因后果,才能真正理解了。刚刚从经历了懵逼到理解的过程,我得赶紧记录下我理解此算法的过程,相信很多刚刚看此算法的同学们,应该会有很多和我一样的问题。首先,先讲述一下此算法的作用是什么,为什么要用AC算法,什么时候用?AC算法主要是解决多字符串匹配问题,比如字符串us...

2019-03-18 17:02:14 6819 3

原创 Spring之利用Java配置类@Component进行注入(SpringBoot中的bean注入方式)

常见的Spring项目中,bean对象要么通过XML文件注入,要么通过注解注入,其实,Spring中还可以通过Java配置类来进行bean的注入。和传统xml方式和注解方式不同的是,不管是xml还是注解注入,都离不开xml文件,xml注入全程在xml中进行,注解方式需要在xml中配置需要注解注入的包,而Java配置类,则完全不需要xml文件,只有Java文件。其实,就是用一个Java类来代替xml文件,这个类和xml文件的作用是一样的,都是为了给Spring容器注入bean。在SpringBoot中,

2020-11-06 17:30:17 93

原创 Spring之使用注解开发

在Spring中,除了在XML文件中用bean标签进行bean注入容器,还可以利用注解的方式将bean的注入Spring容器。一、使用注解方式的配置:首先需要引入AOP的包才可以,有时候哪里都没问题,但是就是报错的话,有可能就是没有AOP的jar包的问题,在maven中检查一下是否缺少该jar包。然后,在xml中的配置如下,主要就是增加了context的约束:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www

2020-11-06 16:54:37 33

原创 Spring中bean的自动装配(注解方式)

Spring中bean有三种装配方式:1.在xml文件中显式配置。(前面介绍IOC和DI的博客已经详细介绍了)2.在Java中显式配置。3.隐式的bean自动装配。(本篇博客重点)bean自动装配方式:一、byName方式修改bean配置,增加一个属性 autowire=“byName”<bean id="cs" class="com.CS"/><bean id="lol" class="com.LOL"/><bean id="student" class=

2020-11-05 12:39:06 59

原创 Spring之DI依赖注入概念详解,使用XML开发(附xml开发模板)

DI:依赖注入依赖:bean对象的创建依赖于容器。注入:bean对象中的所有属性,由容器来注入。一、DI注入的核心,Set注入:所谓Set注入,就是通过set方法来注入,因此,所有属性必须有set方法才可以。常见Set注入的属性包括:1.普通数据类型注入<property name="name" value="小明"></property>2.bean注入,也就是属性中注入其他对象<bean id="address" class="Address">

2020-11-04 19:11:36 40

原创 Spring之IOC思想、IOC创建对象方式、IOC常见配置

IOC和DI:IOC,中文翻译为控制反转,是一种设计思想。而DI,中文翻译为依赖注入,则是IOC的一种实现方法。注意!很多人喜欢把IOC和DI混为一谈,其实不是这样的,IOC是一种设计思想,而DI,则只是实现这种思想的一种方式,一个是思想,一个是行为。同一个思想可以由不同行为实现,不用DI,IOC同样也可以由其他方式实现。IOC思想:所谓控制反转,控制的是什么?反转的又是什么?这是这个概念最需要搞明白的地方。控制的是什么?其实,控制的是对象的创建。在传统的JavaSE面向对象的编程中,对象的创建由程

2020-11-04 11:55:01 67 1

原创 最长回文子串Java

题目:给出一个字符串,找出其中最长回文子串。例如:babad中,最长回文子串有两个bab和aba。思路:我的思路比较简单,就是以某一个字符为中心,依次向两边扩展,看两边的字符是否相同,相同的话,就继续往两边扩展;不等同,则停止,或者遇到边界就停止。从字符串的第二位到倒数第二位依次选为中心进行遍历。用一个map保存结果,key为长度,value为该长度的回文串数组,最后输出map中key长度最长的回文串即可。Java代码:public static void main(String[] args) {

2020-11-04 10:47:15 32

原创 最长回文串Java

题目:给出一串字符串,找出有可能组成的最长回文串的长度。例如:abccccdd,可以组成ccdadcc,也可以组成ccdbdcc,最长回文串的长度为7。思路分析:分析题目就能看出来,所有可能的回文串组合,其实还是比较简单的,并不考虑字符串中字符的初始位置。因此,只需要找出总共有多少成对的字符,最后再加上一个单个字符(如果有的话),就是可能组成的最长回文串长度。Java代码:public static void main(String[] args) { String str="abccccdd"

2020-11-02 18:12:52 26

原创 两个栈实现队列Java

这题其实很容易,就讲个思路吧。先把元素入栈一个栈1,然后,再把这个栈1中所有元素出栈到另一个栈2,此时,栈1的栈底元素就到栈2的栈顶了,再对栈2出栈就是先进先出了。不过。此题需要注意的一点就是,如果此时再进行入队列操作,只能对栈1入栈,并且,如果栈2不为空的话,是不能将栈1中元素入栈栈2的,不然就会出错,就不是先进先出了,这个细节需要注意一下。代码就不贴了,这题太简单了,就是简单出栈入栈而已,注意一下这个细节就行了。...

2020-11-02 17:55:33 19

原创 栈的压入弹出序列Java

题目要求:给出两个序列,第一个序列表示栈的压入序列,第二个表示栈的可能的弹出序列,现在需要判断,这个弹出序列,是否可行。例如:压入序列:1、2、3、4、5出栈序列:4、3、5、1、2(违规序列,由入栈序列不可能得出这个出栈序列)出栈序列:4、5、3、2、1(合法序列)思路:首先,创建一个空栈,然后,比较压入序列的第一个数1和出栈序列的第一个数4是否相等,若相等,则入栈序列和出栈序列依次往后移动一位,若不相等,把压入序列第一个数1压入空栈,然后再看第二个数,过程同上,直到某个数和出栈序列第一个数相

2020-11-02 17:37:46 235

原创 用数组实现栈Java

用数组实现栈的数据结构,实现入栈,出栈,查看栈顶元素,判空,长度等方法,还要考虑扩容问题。代码:public class MyStackByArray { //数组默认长度为10,超出长度就扩容为2倍 private int maxSize=10; private Object[] arr=new Object[maxSize]; //栈顶指针,-1标志栈空 private int pointer=-1; //入栈 public void push(Object o) { //

2020-11-02 16:46:15 32

原创 LeetCode力扣,两数相加Java

两个单链表。从表头依次代表个位、十位、百位…现在需要将两个数相加,形成一个新链表,新链表的值等于两数相加。思路:思路很简单,需要一个进位标志,然后依次取出第一位,相加就行了,如果结果大于10,就对10取余数,然后进位标志改变。每次相加前,查看进位标志位,如果改变了,就多加1,然后恢复进位标志。代码也不难,最好自己写吧,我的代码写的也比较简单马虎,仅供参考吧: boolean jinwei=false; while(node1!=null&&node2!=null) { i

2020-11-02 16:35:25 25

原创 合并两个有序链表Java(归并排序)

合并两个有序单链表,其实就是归并排序。归并排序:先创建一个新链表,长度是两个单链表之和。然后比较两个单链表的第一个数,把数小的放入新链表,然后指针后移一位,依次比较,当某个链表遍历完了,把另一个链表剩下所有直接添加新链表后面就行了,时间复杂度O(log2n)Java代码://创建空链表 LinkNode node=new LinkNode();//头指针 //空链表指针 LinkNode z=node; while(node1!=null&&node2!=null) {

2020-11-02 16:21:35 26

原创 Java输出单链表倒数第K个节点

这题就一个思路问题,想到了就容易,想不到就感觉很难,容易从超高时间复杂的角度来考虑问题。思路:倒数第K个节点,其实也就是正数第Length-k+1个节点。因此,两个指针就完事了,一个先不动,另一个指针先跑k-1步(注意:此时,第一个指针跑了k-1,其实此时这个指针距离第二个指针为k),然后,两个指针同时往后跑就行了,他们的距离为k,直到前面的指针跑到末尾,另一个指针指向的就是倒数第K个节点。代码:public static int getDaoShuK(int k,LinkNode pre,Link

2020-11-02 16:01:49 26

原创 括号匹配深度(爱奇艺18年秋招Java题)

题目:1、空串是一个合法括号匹配序列,且深度为02、如果x和y是合法序列,则xy也是合法序列,且深度为max(x,y)3、如果x是合法序列,则(x)也是合法序列,、且深度比x加1例如:()()()的深度为1,(())的深度为2,(())()的深度为2。题目给出一个括号序列,然后输出最大匹配深度。思路:首先,设置个值max,从头遍历,遇到"(“就max加1。设置一个布尔值,初始为true,当遇到”)",时,设为false,这个布尔变量的作用,是用来标记,一个旧的重叠的括号序列是否结束,用来判断后

2020-11-02 12:03:05 52

原创 Java交替打印奇偶数

这个算法需要解决两个问题:怎么实现交替打印?怎么实现奇偶数?算法一:(互斥实现)用一个自增的数,依次对2取余,来实现奇偶数。然后,用信号量(信号量底层用原语实现互斥同步,很方便,大家可以去了解一下,不过这里就是实现互斥,可以理解为就是一个锁)来实现互斥操作,即实现交替打印。具体思路:定义一个互斥信号量,初值为1,为了实现互斥操作。定义一个num变量,从1开始,依次增加,每次对2取余,如果是奇数,就进入奇数的线程,然后,拿到互斥锁,此时信号量为0,偶数线程拿不到锁,等待。打印完奇数,然后num++,释放锁

2020-11-02 11:25:25 18

原创 Java实现生产者消费者问题(信号量机制)

首先,先讲一下生产者消费者问题的本质,其实就是同步和互斥的问题。所谓同步问题,其实这个名词,容易让人迷惑,同步,是同时的意思吗?其实不是,反而是不同时的意思。同步问题,其实就是一前一后的问题,某个进程或者程序,必须在另一个的前面或者后面执行,他俩不能同时执行,就是这个意思。如果说同步是对进程或者程序的执行顺序的规定。那么互斥问题,其实更多是对某个资源的规定,即某个资源不能同时被两个进程占用。就比如说生产者消费者问题中,生产者占用缓冲区往缓冲区放产品的时候,消费者就不能用缓冲区,此时,缓冲区对生产者和消费

2020-11-02 10:47:26 59

原创 用一个栈对另一个栈排序Java实现

题目要求:给定一个栈,让你用一个辅助栈对其元素进行排序。思路:设原始栈为s,辅助栈为helper。1.s出栈栈顶元素,记为pop。2.用pop和helper的栈顶元素比较,若helper为空,或者pop小于等于helper栈顶元素,就直接让pop入栈helper。(这一步相当于,若pop小于helper栈顶元素,pop直接入栈)若执行了这一步,则3、4不用执行,再次从第一步继续执行。3.若pop大于helper栈顶元素,则就让helper栈顶元素出栈并入栈s。(这一步相当于,若pop大于helpe

2020-10-25 10:04:48 12

原创 递归实现反转栈Java

烧脑提醒!烧脑提醒!烧脑提醒!不皮了,下面开始正题。题目要求:用递归实现栈反转。我走的弯路:首先,我刚开始的想法,我觉得,递归其实本质也是个栈类型的数据结构,所以可以利用递归过程的栈来实现反转。其实,这个思路有问题,因为你递归的过程中,其实也是在出栈操作,当你递归到栈底时,此时,递归函数中最后一个值也是栈底元素,此时,再入栈,其实又原路返回了,所以,必须在此基础上,再递归一次,我看到网上有这种解法,太恶心了,两个递归嵌套。其实这种解法并不是此题的本意,此题的本意是考查对递归思想的深入理解。我的解法

2020-10-24 18:02:10 21

原创 三元组a+b+c=0算法(三数相加)

题目:给定一个乱序数组 {-1, 0, 1, 2, -1, -4},寻找 a + b + c = 0的三元组。并去重。思路:一,先排序,从小到大。二,定义三个指针,第一个a,指向数组第一个位置,第二个b,指向第二个位置,第三个c,指向最后一位。三,然后,计算a+b+c,看是否等于0。1.如果等于0,将结果放入set中保存,然后a不动,b往右移动一位,c往左移动一位,继续计算a+b+c。2.如果小于0,则b往右移动一位,继续计算a+b+c。3.如果大于0,则c往左移动一位,继续计算a+b+c。

2020-10-22 23:20:27 43

原创 奇数在偶数前面

算法要求:随机给定一个整数数组,设计一个算法,使得数组中奇数都位于偶数前面,并且奇数和偶数的相对位置不变。思路很简单,先遍历一遍数组,计算出有多少个奇数,奇数+1就是偶数开始存放的位置,然后,创建一个新数组,然后,再遍历一遍数组,遇到奇数就从头添加进新数组,遇到偶数,之前计算出的偶数位置往后添加。代码:public static void main(String[] args) { //随机给定一个整数数组,设计一个算法,使得数组中奇数都位于偶数前面,并且奇数和偶数的相对位置不变 int[]

2020-10-18 17:42:33 27 1

原创 斐波那契数列Java

数列:0,1,1,2,3,5,8,13…其实就是每一个数都等于前面两位的和简单思路就是递归,输入n,就是斐波那契的第n位的值,然后当递归到n时,递归结束,输出第n位的值。代码:public static int n=2;//出门ab就有两位了,因此n初始为2 public static void main(String[] args) { int num=6; int result=feiBoNaQi(num,0,1); System.out.println(result); }

2020-10-18 17:19:49 41

原创 Java实现单链表反转(头插法就地反转)

此算法题,需要在纸上演算一下,画一个单链表,然后用头插法模拟链表反转,所谓头插法,就是有一个头指针,一直指向头结点。我尝试过两个指针,发现做不到,头插法必须要有三个指针,一个是头指针,一直指向头结点,另外一个指针指向要断开节点的前一个,最后一个指向要断开节点的后一位。代码:public static void main(String[] args) { //头插法就地反转 LinkNode node=new LinkNode(1); node.next=new LinkNode(2);

2020-10-18 17:09:00 46

原创 Java实现快速排序,深入解释为什么从右边开始

先讲一下快排的思想:先抓取数组第一个数,记为key,一趟排序后,将这个数放在最终位置,也就是说,第一趟排序后,这个数左边都是比它小的数,右边都是比它大的数。例如:2,1,4,3抓取第一个数2,记为key,一趟排序后,2放在第二个位置:1,2,4,3此时,2的左边都比它小,右边都比它大。此算法需要两个指针,分别从最左边和最右边开始向中间遍历。如果抓取最左边的数作为key,那么,需要先从右边的指针往中间遍历,遇到比key小的数停下,然后左边的指针开始从左向右遍历,遇到比key大的数停下,然后左右指针的

2020-10-18 10:33:54 24

原创 KMP算法(个人从懵逼到理解过程详解)

KMP算法(个人从懵逼到理解过程详解)首先要知道,KMP是解决字符串匹配问题的,是在暴力匹配的基础上进行优化。所谓暴力匹配,就是长串与短串之间挨个字符对比,当出现不匹配时,短串向后后移一位,再次从头匹配。而KMP算法,就是在对此进行优化:当出现不匹配时,是否可以多往后移动,从而减少不必要的比较过程。说到KMP算法,网上各种大神,各种详解,上来先讲KMP是干嘛的,然后就直接讲怎么求next数组,然后当出现不匹配时,代入next数组,成功跳转。我:???就我个人学习过程来说,最需要的是理解next数组是干

2020-09-18 19:12:54 61

原创 LeetCode无重复字符的最长子串Java(最容易理解的滑动窗口回溯过程)

题目要求:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。题目

2020-06-20 12:46:54 83

原创 LeetCode算法两数之和Java详解(第一题)

LeetCode算法两数之和Java详解(第一题)题目要求:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]以上是力扣中的原话,要求其实有点绕,其实就是告诉你有个数组,现在已知数组中两

2020-06-18 18:03:02 64

转载 Ubuntu16安装jdk1.8运行环境

亲测有效,安装成功了,所以转载这篇:搭建环境:Ubuntu 16.04 64位JDK :jdk-8u171-linux-x64.tar.gz首先下载linux对应的安装包下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载完成后,Linux默认下载位置在当前...

2019-05-28 15:58:48 31

转载 Ubuntu(Linux)系统安装谷歌(Google)浏览器

亲测有效,所以转发一下:1.打开终端2.在终端输入以下命令: sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.list.d/3.在终端中,输入以下命令: wget -q -O - https://dl.google.com/linux/linux_...

2019-05-28 15:48:50 180

原创 爬虫自动滚动下一页JS控制

在写爬虫程序的时候,会遇到一些特殊情况,比如,爬取某些网页的时候,网页当前页面是不存在下一页的按钮,当你将下拉框拉到底部时,JS会自动加载下一页的内容,这种情况下,调用爬虫的话,无法通过获取下一页的按钮标签点击下一页来进入下一页,例如:推特。所以这篇博文就是解决此问题的。需要jar包:seleniumstatic { System.setProperty("webdriver.chrome...

2019-05-28 15:36:04 12841

转载 java正则表达式大全

一、校验数字的表达式1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和非零开头的数字:^(0|[1-9][0-9]*)$6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?...

2019-05-28 15:02:55 30

原创 Java利用poi解析xlsx和xls文件

遇到过处理excel的问题,在网上找了很久,感觉他们的代码太乱太复杂,这是我精简版的excel处理代码,简单暴力。首先,为什么使用poi?jxl只能处理03版之前的excel,也就是xls结尾的,不能处理xlsx。poi兼容两种格式,poi解析两种格式的文件时,唯一的不同就是xls时,为HSSF;xlsx时,为XSSF。首先是处理Cell对象的小方法://这个方法对cell进行处理,传入ce...

2019-05-27 16:22:22 2307

原创 Windows安装mysql

第一步mysql官网下载地址:https://dev.mysql.com/downloads/mysql/ 下载第一个下载后解压缩,解压到你自己规定的路径。我的是 : D:\mysql\mysql-8.0.15-winx64第二步解压缩后,配置环境变量,打开系统环境变量,在系统环境变量中新建环境变量:变量名:MYSQL_HOME变量值:D:\mysql\mysql-8.0...

2019-03-22 16:22:32 38

原创 Linux谷歌无界面爬虫java版

1 下载chrome linux版和对应版本的webdriver。chrome:自己去下载,网址网上一搜索一大片chromedriver:http://npm.taobao.org/mirrors/chromedriver/ 这里一定要注意:chrome一定要和driver的版本兼容,不同版本的chrome需要对应不同的chromedriver。2 java代码System.setPr...

2019-02-27 15:48:49 208

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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