自定义博客皮肤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)
  • 收藏
  • 关注

原创 【mybatis-plus的增删改查】

二、mybatis-plus与spring boot2.1 数据库与表创建一个数据库:create database mytest;创建一个表:DROP TABLE IF EXISTS user;CREATE TABLE user( id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT

2021-11-25 11:13:10 2646 1

原创 ThreadLocal原理

原理使用/** * @author FANG * @version 1.8 * @coding UTF-8 * @date 2020/8/22 19:17 */public class ThreadLocalTest1 extends Thread { private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>(); //也不能通过静态代码块初始化 static

2020-08-23 11:22:36 188

原创 阿里巴巴笔试题

第一题放牛问题: 假设你家有n头牛(体重各不相同),但是这牛是薛定谔的牛,你不知道它具体是什么颜色,只有牵出来才知道,颜色有m种。然后问你一共有多少种不同的放牛方法。也就是说你可以拉出多少不同状态的牛,只有当牛的数量、体重和颜色完全一样时才视为同一个状态。注意:因为可能结果很大,因此需要模1000000007.例如:n=3, m=2。你可以选择一头牛也不牵出来,此时只有1种状态;你也可以牵出1头牛,则有C31C_3^1C31​种可能,牛的颜色可能有2种,此时一共6种状态;你可以牵出2头牛,则有C3

2020-08-04 20:46:41 400

原创 腾讯笔试题

第1题实现一个循环队列。没什么好说的,看基本功(但是我太紧张了,实现对了,面试官让我测试一下,我测试的时候写了个死循环,唉命苦)。我使用的链表实现的,既有单链表也有双链表。public class QueueTest { private DNode head; private DNode tail; public QueueTest() { head = new DNode(-1); tail = head; head.pre =

2020-07-24 15:21:59 295 2

原创 jvm执行引擎

64bit的jdk只支持server模式。

2020-07-22 15:08:17 64

原创 对象的实例化

创建对象的方式对象创建的步骤判断类是否加载为对象分配内存内存规整内存不规整如何选择处理并发安全问题比较与交换(CAS)TLAB初始化分配到的空间设置对象的对象头执行init方法进行初始化静态变量的初始化默认初始化在类的加载时进行的。然后在准备阶段如果有静态代码块,则类变量还会进行正式的初始化属性的初始化默认初始化默认初始化,是赋“零”值,因为有默认初始化,所以属性不需要赋初值也能使用。但是方法内部的局部变量就没有默认初始化,所以

2020-07-21 15:08:04 314 3

原创 详细分析jvm中i++与++i背后的指令

第1类问题public void addTest1() { //第1类问题 int i1 = 10; i1++; int i2 = 10; ++i2; /** * 对应的指令 * 0 bipush 10 10入栈 * 2 istore_1 栈顶存入slot1,此时i1=10 * 3 iinc 1 by 1 slot1加1,此时i1=11 * 6 bipus

2020-07-20 15:20:08 278

原创 jvm内存结构

方法区(Method)方法区是一个概念,对应的实现在jdk1.8以前叫永久代(permspace),以后叫元空间(metaspace),元空间顾名思义是用来存放元数据的,而元数据是用来描述数据的数据,这里是用来描述类的数据。因此元空间里主要存的是与类有关的信息。编译一个java文件,然后使用javap -v -p xxx.class > file.txt反编译可以得到一个类的机器码信息等,我们来看看类里面都包含了什么信息,这样就可以了解元空间都存了什么东西。Classfile /Employee

2020-07-18 11:55:01 222

原创 逃逸分析技术与栈上分配

实验部分代码:public class EscapeAnalysisTest { public static void main(String[] args) { long t0 = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { alloc(); } System.out.println(System.currentTi

2020-07-16 15:51:13 355

原创 System.out.println()的背后

System类打开其源码,可以看到out是它的一个静态变量,类型为PrintStream:public final static PrintStream out = null;因此就可以通过System.out的方式使用它。但是这里的out是个null,如果直接使用,肯定是不行的,因为它是一个常量,一旦这个类被加载到虚拟机中,就不可再更改了。于是我猜测可能是有了这个初始化类的方法,使得其在类的加载过程中被赋予了一个新的引用:/** * Initialize the system cl

2020-07-15 17:14:21 902

原创 分支限界算法2

7. 概率最大的路径首先声明一下,这道题使用分支限界算法是通不过的,超时了。但是毕竟是一种解决问题的方法,自己在自己电脑上是可以运行的。问题的解: 最大概率路径的概率,因此都不用使用向量作为解,直接给结果就可以搜索策略: 深度优先,其实使用广度优先可能更好一点,因为每条边的概率都小于1.0,意味着路径越长概率越容易变得很小。而我们知道深度优先搜索树的深度是最大的,而广度优先得到的深度是最小的也就是路径长度更倾向于短,则得到的概率更大约束条件: 已经搜索过的结点就不应该再次出现在路径上,不然就形

2020-07-13 20:06:54 252

原创 分支限界算法1

1. 分支限界介绍分支限界通常是将一个完全形态的搜索树(树的叶子结点可能是可行/最优解)通过限界技术在一些不可能得到正确答案的分支上进行剪枝,从而达到减小搜索空间的目的。解 与解空间通常,解是一个/组向量:<x1,x2,x3,x4,...,xn><x_1, x_2, x_3, x_4,..., x_n><x1​,x2​,x3​,x4​,...,xn​>。并且解具有多米诺性质:若部分解<x1,x2,x3,...,xk><x_1, x_2, x_3,

2020-07-06 13:04:21 1433

原创 随机数生成器转换

问题描述给定一个随机数生成器rand7,它只能等概率生成0-6这7个整数。请使用rand7制作一个生成器rand10,使其可以等概率返回0-9这10个整数。解决办法利用进制转换的方法。我们知道一个7进制数xy转换成10进制数的方法是每一位的数字乘以该位上的基,所以xy表示的十进制数是x * 71 + y * 70。如果x和y都是一个在0-6内的随机数,那么自然得到的十进制数也是在0-48之间的均匀随机数,得到任何一个数字的概率都是1/49。我们在0-48之间只取0-39这40个随机数,当生成的数大

2020-07-03 18:19:40 571

原创 字符串常量池

字符串常量池字符串常量池存在于堆中,但是和new的对象不在一个地方,虽然都在堆中。字符串常量池在java8中最小应为1009,其底层原理是一个HashSet。因此每一个字面量在字符串常量池中只允许存在一份。所以上面的三个引用都指向同一个字符串,它们三个是==为true的。字符串变量拼接操作底层原理如上所示,当拼接的式子中只要出现了一个或者更多的字符串变量引用,则java的处理过程是:在堆中new一个StringBuilder对象;然后调用append()方法拼接;最后调用toString

2020-07-02 20:35:22 581

原创 死锁

1. 什么是死锁死锁是指多个进程或线程在并发执行过程中,因竞争资源不得而造成的所有进程或线程都阻塞的现象。死锁建模有向图表示资源分配图:圆节点表示进程,方节点表示资源,资源结点指向进程结点的有向边表示占有一个资源或持有一个资源,进程结点指向资源结点表示请求该资源。如果每种资源只有一个,则在资源分配图中,一旦出现了环,表明一定有死锁。2. 死锁产生的必要条件注意这是必要不充分条件,就是说当出现死锁时,一定会有这四个条件成立,但是这四个条件成立不一定会出现死锁。3. 鸵鸟算法系统假装没有死锁

2020-07-01 19:25:57 122

原创 哲学家用餐问题

1. 条件语句的原子性你可能会有点疑惑,这不是讲哲学家用餐问题的吗,为什么一上来你先甩一张毫无相干的图,这里又提条件语句的原子性?别着急,一会儿你就会看到原因了。我们先来看看上面的图,右上角是java语言写的语句;左下角是经javap得到的汇编代码。使用箭头将对应部分连接了起来。可以看到一个最简单的if条件语句(图中蓝色框)都至少要两条指令,一条用于取操作数(在i > 0这个比较中0是个常量,不需要取操作),一条用于比较转移(即如果不成功跳转到哪一步执行,因为如果成功直接顺序执行即可)。如果.

2020-06-26 17:31:43 4380 1

原创 java多线程

Thread.yield()本线程放弃执行,然后与其它所有同级的线程共同竞争执行权。t.join()如果某个线程在另一个线程t上调用t.join(),此线程将被挂起,直到目标线程t结束才恢复。i++; ++i在java中,这个自增自减的操作不是原子性的,实质上是取i值,将i值加一,赋值给i这三个操作的复合。synchronizedJava以提供关键字synchronized的形式,为防止资源冲突提供了内置支持。当任务要执行被synchronized关键字保护的代码片段的时候,它..

2020-06-20 18:34:22 103

原创 一个思想类似的动态规划系列

1. 问题经常以数组序列形式出现,问的是最xxx?之前一篇已经提到过,动态规划划分子问题是首要,一定要定义一个比较好的子问题表达式,这样才可以较容易求得状态转移方程。这类动态规划问题如下:乘积最大子数组最大子序列和最长上升子序列连续子数组的最大和...

2020-06-15 21:58:35 108

原创 算法--灯全亮

1. 问题描述给你100盏灯围成一个圆环,灯有两种状态,要么是亮的要么是灭的,灯的初始状态是随机的。每个灯有一个开关,灯的开关具有这样的作用,按一下某个灯的开关,则该灯以及它相邻的两个灯的状态都会发生一次变化,即亮的变成暗的,暗的变成亮的。例如亮–亮--亮,按下中间的开关,则三盏灯全灭,亮–暗--暗,按下中间的开关,变成暗–亮--亮…问你有没有办法使得100盏灯全亮,如果有,请说明你的算法思路。2. 解决方法全灭的灯怎么处理?我们先来考虑一个特殊情况:所有的灯都是灭的。然后我们这么做:将灯编号

2020-06-11 22:14:05 1134

转载 概率图入门

1. 基本概念概率图模型(或简称图模型)在形式上是由图结构组成的。图的每个节点(node)都关联了一个随机变量,而图的边(edge)则被用于编码这些随机变量之间的关系。根据图是有向的还是无向的,我们可以将图的模式分为两大类——贝叶斯网络( Bayesian network)和马尔可夫网络(Markov networks)。2. 贝叶斯网络:有向图模型上图是关于一个大学生的概率模型。图中5个点表示5个随机变量,有向边表示随机变量之间的关系,与点相关联的表格表示随机变量之间的条件概率(CPD/cond

2020-06-11 13:35:30 885

原创 java实现关联规则算法--Apriori

实现package com.ftq.demo.highlevel;import java.io.*;import java.util.*;public class MyAprioriDemo { private double min_sup;//支持度阈值 private double min_con;//置信度阈值 //构造函数 MyAprioriDemo(double min_sup, double min_con){ this.min_su

2020-06-06 14:04:51 807

原创 如何生成随机且不重复的随机序列

1. 问题引入今天同学给我发了一个题目,让我做。题目是这样的:2. 问题抽象这个问题不难,相信高中生都可以做的出来,大致思路就是:首先随机挑出k员工分为k组,这样可以保证每一个组至少有一个员工;然后将剩余的员工随机分到k组中。那么这么简单的题目为啥还要提一下呢?这是一个公司的笔试题,给60分钟解答时间。但是真的当我动手的时候,才发现这里有一个坑。第一步中要求每次随机挑出一个员工,如何保证已经被挑出的员工不再参加分组?当然python有一个random.choice(),可以随机挑出一个,

2020-06-03 21:18:21 1772

原创 双链表+HashMap实现LRUCache

1. LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。进阶

2020-05-30 22:07:39 252

原创 分治递归算法之醉翁之意不在酒

1. 算法特点望其名而知意,这种算法特点是递归函数的返回值不是真正的答案,或者说答案不能作为递归函数的返回值,有点绕,下面看几个例题。2. 实例讲解二叉树的直径对于二叉树的问题,一般采用递归的方法,下面几题也是一样。题目要求的是二叉树的直径,那么递归函数直接返回直径就行了?看了本文的题目醉翁之意不在酒,就知道了,肯定没这么简单。那么我们来看一下为什么不能直接返回题目要求的直径。二叉树的递归基本就是分而治之,将大问题化成子问题,那么我们来看看子问题的解和原问题的解是否具有相关性,即能够在分了之后

2020-05-29 17:48:44 103

原创 字符串匹配

1. 问题描述给定一个目标字符串string,和一个模式字符串sub,求sub是否是string的子串的问题就叫做字符串匹配,也叫做模式匹配。2. 暴力算法枚举string的每一个长度为sub.length()的子串,然后检查其是否和sub相同。// 判断a[i:j)与b[l:r)是否相同public boolean isEquals(String a, int i, int j, String b, int l, int r){ if((j - i) != (r - l)) ret

2020-05-28 23:20:00 253

原创 两数之和

1. 问题介绍2. 问题本质问题实际上是一个查找问题。基本思路就是遍历每一个元素a,然后在数组或者BST(二叉搜索树)中查找k-a。而查找最快的是hash,常数级别,不过需要额外空间;其次,如果元素有序,则可以使用二分查找,时间为O(lgN);再然后就是遍历,时间为O(N).3. 对于问题653的具体解法首先要注意的是一个细节:题目中没有说树中元素不能重复。因此在使用hash集合时,要考虑重复元素的问题。再有就是,在进行查找时,要注意把自身排除。解法一:利用二叉树非常适合递归的特点,选用递

2020-05-26 23:21:46 79

原创 累加和(积)数组与滑动窗口

1. 什么是累加和数组?设有数组nums[n],累计和数组sum[n]中的第k项元素是:sum[k]=∑i=0knums[i]sum[k] = \sum_{i=0}^{k}nums[i]sum[k]=i=0∑k​nums[i]例如:nums[10] = {0,1,2,3,4,5,6,7,8,9},则nums的累加和数组sum[10] = {0,1,3,6,10,15,21,28,36,45}。反过来:nums[i]={sum[i],i = 0sum[i]−sum[i−1],i&n

2020-05-26 15:35:18 983

原创 回溯法搜索问题的优化--以单词拆分问题为例

1. 单词拆分问题2. 确定解题思路经过思考,发现这是一个搜索问题。每次从s开头截取一个子串s’,如果s’在字典中,则继续搜索s剩余的部分;如果没在就不需要往下搜了。根据这个思路,可得代码如下:class Solution { boolean able = false; public void search(String s, Set<String> set){ if(able) return; if(s.length() == 0){

2020-05-25 16:42:25 207

原创 算法设计--动态规划

1. 动态规划动态规划(dynamic programming)是一种动态地求解问题的解的算法,其核心在于动态二字,就是问题的最优解依赖于子问题的最优解,因此要求原问题就要知道子问题的解,还要知道原问题和子问题之间的关系,也就是递推方程。尽管动态规划听起来很容易用递归实现,但是实际上往往我们使用的是迭代的方法,因为递归过程有很多重复的子问题,造成时间复杂度过高。递推方程是核心,动态规划问题最重要的就是找出正确的递推方程。子问题划分是首要,如果你的子问题都没定义明白,那就不要想得到递推方程了。哈哈,上

2020-05-22 20:59:42 174

原创 数据结构之单调栈(按单减栈)

1. 单调栈是什么单调栈是这样一个栈,它里面的元素从栈底到栈顶依次递减。2. 单调栈怎么生成假如我们有一个数组nums[n]=[4,2,0,3,2,5],和一个空的栈stack。我们遍历数组,对遇到的每一个元素num:如果栈为空,则将num进栈;否则,取栈顶元素top与num比较:num 小于top,则将num进栈;否则,top出栈,新的top与num比较;下面是栈的变化情况:4424204243

2020-05-20 23:16:36 919

原创 回溯法+剪枝解决组合总和问题

1. 问题描述给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。例子:输入:[2,3,6,7],target=7。输出:[[2,2,3],[7]]。2. 解法根据问题的描述,我们想到了使用树形结构进行遍历来求解。首先需要确定遍历的深度,到什么地方要终止搜索,

2020-05-19 21:50:19 419

原创 找出数组中出现奇数次的数

1. 问题描述输入: 有一个数组nums[n],其中有且仅有两个数出现了奇数次,其余的都出现偶数次。输出: 输出这两个出现奇数次的数。2. 解决方法对于只有一个数出现奇数次的数组,我们可以利用异或的性质(同为0异为1),将所有的数相异或,最后就只剩下出现奇数次的数。但是现在有两个出现了奇数次,要是还按上面的方法,最后的结果将是这两个数的异或结果,我们又分不开。怎么办呢?我们已经知道了只有一个数出现奇数次的解决方法。能不能考虑一下分治的思想呢,就是将这个数组分成两个子数组,然后保持每一个子数组只有

2020-05-19 19:26:06 1347

原创 JAVA泛型

1. 需求今天一个同学让我帮他写一个归并排序和快速排序的代码。我首先想到使用泛型,这样就可以不用限制非得是int型数组。2. 实现// 归并排序,分为两个过程:// 1.分治递归// 2.合并 public <T> void mergeSort1(T[] nums, int to, int from){ if(from - to < 2) return; int mid = (to + from) >>>

2020-05-19 18:18:27 61

原创 芯片检测(分治法经典问题)

1. 问题描述有一批芯片(n片),里面有好芯片有坏芯片,我们不知道哪片是好的哪片是坏的,只知道里面的好芯片一定比坏芯片至少多出一片。现在有一个检测设备,同时将两片芯片放进去,它们会各自报告对方的情况,好芯片的报告结果一定是真实的,坏芯片的报告结果是不确定的(有可能是真实的,也有可能是假的)。会有这样的报告结果:芯片A的报告芯片B的报告结论好好AB都好或者都坏好坏假如两个都是好的,显然矛盾了,因此至少有一个坏的坏好同上,至少有一个坏的坏坏反证,可得

2020-05-18 20:13:40 2222

原创 平面点对问题(分治法的经典问题)

1. 问题介绍平面上有n个点points[n](points[i] = (xi, yi)),求它们之间的最近距离。2. 常规解法首先想到利用握手法则,两两求点之间的距离,然后进行比较可以找到最近距离,时间复杂度为O(n2)。代码如下:// 使用暴力法验证一下 long t2 = System.currentTimeMillis(); dis = Point.distance(p[0],p[1]); for (int i = 0; i &

2020-05-17 21:37:37 1266 2

原创 Integer类的源码解读

1. 继承关系Integer继承自抽象类Number,实现了Comparable<>接口.2. IntegerCache内部类他还有一个IntegerCache内部类,里面存了-128到127的Integer对象;当我们用int数据给Integer型对象引用赋值时,采用自动装箱的办法,调用valueOf()方法;public static Integer valueOf(int i) { if (i >= IntegerCache.low && i &lt

2020-05-12 23:28:46 429

原创 JAVA数组的hashCode()实现

1. 数组元素类型基本类型:int, boolean, char, long, float, double, short, byteObject对象2. 基本类型数组arr[n]基本类型的数组,其hash值为int型:hash = 31n + 31n-1 × arr[n-1] + 31n-2 × arr[n-2] +…+arr[0].当数组为空时,hash值为0;当元素位数不是32位时:对于boollean型,如果是真,将对应的值改为1231,如果是假改为1237.对于低于32位的,

2020-05-12 18:46:08 2257

原创 字符串的循环后移

1、方法字符串(或者数组)的循环后移指的是,将每一个元素都往后移,后面没有空间时,添加到开头。例如字符串abcdef循环后移1位为fabcde,后移2位得到efabcd,后移3位得到defabc…将字符串后移k位的方法:整个字符串逆置;前k个逆置;后面剩余的也逆置;使用额外空间的方法:将字符串复制一份放到后面:abcdefabcdef;截取其中的一个子串[k, k+l),其中...

2020-05-07 21:28:00 2245

原创 计算二进制数中1的个数

1、逐位遍历public int bitCount1(int n){ int count = 0; while(n != 0){ count += (n & 1); n >>>= 1; } return count;}原理: 每个数与1的结果就是该数最后一位上1的个数。2、跳过不必要的0publi...

2020-05-07 21:03:27 374

原创 二叉树的几种后序遍历方法,递归,非递归

二叉树的后序遍历算法比较难,尤其是非递归。但是后序遍历的应用最广泛,最容易出现算法题,因此一定要牢牢掌握。其中迭代的方法又较递归的方法快,但是也是非常令人头疼的一件事。递归算法public void postOrderRecur(TreeNode root){ if(root != null){ postOrderRecur(root.left); ...

2020-04-29 21:51:04 1401

空空如也

空空如也

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

TA关注的人

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